Mercurial > hg4j
annotate src/org/tmatesoft/hg/core/HgUpdateConfigCommand.java @ 709:497e697636fc
Report merged lines as changed block if possible, not as a sequence of added/deleted blocks. To facilitate access to merge parent lines AddBlock got mergeLineAt() method that reports index of the line in the second parent (if any), while insertedAt() has been changed to report index in the first parent always
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 21 Aug 2013 16:23:27 +0200 |
parents | 0205a5c4566b |
children |
rev | line source |
---|---|
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
1 /* |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
2 * Copyright (c) 2012 TMate Software Ltd |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
3 * |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
4 * This program is free software; you can redistribute it and/or modify |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
6 * the Free Software Foundation; version 2 of the License. |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
7 * |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
8 * This program is distributed in the hope that it will be useful, |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
11 * GNU General Public License for more details. |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
12 * |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
13 * For information on how to redistribute this software under |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
14 * the terms of a license other than GNU General Public License |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
15 * contact TMate Software at support@hg4j.com |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
16 */ |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
17 package org.tmatesoft.hg.core; |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
18 |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
19 import java.io.File; |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
20 import java.io.FileInputStream; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
21 import java.io.FileOutputStream; |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
22 import java.io.IOException; |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
23 import java.util.LinkedList; |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
24 import java.util.List; |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
25 import java.util.Map; |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
26 |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
27 import org.tmatesoft.hg.internal.ConfigFile; |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
28 import org.tmatesoft.hg.internal.ConfigFileParser; |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
29 import org.tmatesoft.hg.internal.Internals; |
382
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
378
diff
changeset
|
30 import org.tmatesoft.hg.repo.HgInternals; |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
31 import org.tmatesoft.hg.repo.HgInvalidStateException; |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
32 import org.tmatesoft.hg.repo.HgRepository; |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
33 |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
34 /** |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
35 * Command to alter Mercurial configuration settings at various levels (system-wide, user-wide, repository-wide). |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
36 * |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
37 * @author Artem Tikhomirov |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
38 * @author TMate Software Ltd. |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
39 */ |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
40 public final class HgUpdateConfigCommand extends HgAbstractCommand<HgUpdateConfigCommand> { |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
41 |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
42 private final SessionContext sessionCtx; |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
43 private final File configFile; |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
44 |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
45 private final List<Operation> changes = new LinkedList<Operation>(); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
46 private boolean ignoreMissingKeys = false; |
483
e31e85cf4d4c
Handle include and unset directives in config files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
427
diff
changeset
|
47 |
e31e85cf4d4c
Handle include and unset directives in config files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
427
diff
changeset
|
48 private HgUpdateConfigCommand(SessionContext sessionContext, File configurationFile) { |
e31e85cf4d4c
Handle include and unset directives in config files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
427
diff
changeset
|
49 sessionCtx = sessionContext; |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
50 configFile = configurationFile; |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
51 } |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
52 |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
53 public static HgUpdateConfigCommand forRepository(HgRepository hgRepo) { |
493
ba36f66c32b4
Refactor to keep knowledge about repository control files and their location in respect to .hg/ in a single place (facilitate future adoption of shared repositories)
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
490
diff
changeset
|
54 return new HgUpdateConfigCommand(hgRepo.getSessionContext(), HgInternals.getImplementationRepo(hgRepo).getFileFromRepoDir("hgrc")); |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
55 } |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
56 |
382
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
378
diff
changeset
|
57 public static HgUpdateConfigCommand forUser(SessionContext ctx) { |
483
e31e85cf4d4c
Handle include and unset directives in config files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
427
diff
changeset
|
58 return new HgUpdateConfigCommand(ctx, Internals.getUserConfigurationFileToWrite(ctx)); |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
59 } |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
60 |
382
82336b7c54f4
Per-repository UpdateConfigCommand completed. Access to system properties through SessionContext to ease alternation
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
378
diff
changeset
|
61 public static HgUpdateConfigCommand forInstallation(SessionContext ctx) { |
483
e31e85cf4d4c
Handle include and unset directives in config files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
427
diff
changeset
|
62 return new HgUpdateConfigCommand(ctx, Internals.getInstallationConfigurationFileToWrite(ctx)); |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
63 } |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
64 |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
65 /** |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
66 * Remove an entry altogether. If no entry with the key found, {@link #execute()} fails. |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
67 * |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
68 * @param section identifies section to alter, not <code>null</code> or otherwise ill-formed name |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
69 * @param key identifies entry within section, not <code>null</code> or otherwise ill-formed name |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
70 * @return <code>this</code> for convenience |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
71 * @throws IllegalArgumentException if arguments are <code>null</code> or empty |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
72 */ |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
73 public HgUpdateConfigCommand remove(String section, String key) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
74 checkSection(section); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
75 checkKey(key); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
76 changes.add(Operation.deleteEntry(section, key)); |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
77 return this; |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
78 } |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
79 |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
80 /** |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
81 * Delete single attribute in a multi-valued property. If specified value not found among values of |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
82 * the identified entry, {@link #execute()} fails. |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
83 * |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
84 * @param section identifies section to alter, not <code>null</code> or otherwise ill-formed name |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
85 * @param key identifies entry within section, not <code>null</code> or otherwise ill-formed name |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
86 * @param value one of the values to remove, not <code>null</code> or an empty value |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
87 * @return <code>this</code> for convenience |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
88 * @throws IllegalArgumentException if arguments are <code>null</code> or empty |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
89 */ |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
90 public HgUpdateConfigCommand remove(String section, String key, String value) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
91 checkSection(section); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
92 checkKey(key); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
93 changes.add(Operation.deleteValue(section, key, value)); |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
94 return this; |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
95 } |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
96 |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
97 /** |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
98 * Set single-valued property or update multi-valued with a single value |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
99 * |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
100 * @param section identifies section to alter, not <code>null</code> or otherwise ill-formed name |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
101 * @param key identifies entry within section, not <code>null</code> or otherwise ill-formed name |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
102 * @param value new value, may be <code>null</code> |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
103 * @return <code>this</code> for convenience |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
104 * @throws IllegalArgumentException if arguments are <code>null</code> or empty |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
105 */ |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
106 public HgUpdateConfigCommand put(String section, String key, String value) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
107 checkSection(section); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
108 checkKey(key); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
109 changes.add(Operation.setValue(section, key, value)); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
110 return this; |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
111 } |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
112 |
427
31a89587eb04
FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
423
diff
changeset
|
113 /** |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
114 * Add value to a multi-valued entry. If specified entry not found, {@link #execute()} fails. |
427
31a89587eb04
FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
423
diff
changeset
|
115 * |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
116 * @param section identifies section to alter, not <code>null</code> or otherwise ill-formed name |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
117 * @param key identifies entry within section, not <code>null</code> or otherwise ill-formed name |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
118 * @param value new value to add, not <code>null</code> or an empty value |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
119 * @return <code>this</code> for convenience |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
120 * @throws IllegalArgumentException if arguments are <code>null</code> or empty |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
121 */ |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
122 public HgUpdateConfigCommand add(String section, String key, String value) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
123 checkSection(section); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
124 checkKey(key); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
125 changes.add(Operation.addValue(section, key, value)); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
126 return this; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
127 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
128 |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
129 /** |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
130 * Tells whether {@link #execute()} shall fail with exception if keys selected for modification were not found. |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
131 * If <code>true</code>, missing keys would be silently ignored. |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
132 * When <code>false</code>(<em>default</em>), exception would be raised. |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
133 * |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
134 * @param ignoreMissing pass <code>true</code> to ignore any incorrect keys |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
135 * @return <code>this</code> for convenience |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
136 */ |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
137 public HgUpdateConfigCommand ignoreMissing(boolean ignoreMissing) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
138 ignoreMissingKeys = ignoreMissing; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
139 return this; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
140 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
141 |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
142 /** |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
143 * Perform configuration file update. |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
144 * |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
145 * @throws HgMissingConfigElementException if attempt to alter an entry failed to find one, and missing keys are not ignored |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
146 * @throws HgIOException when configuration file read/write attemt has failed |
427
31a89587eb04
FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
423
diff
changeset
|
147 * @throws HgException subclass thereof to indicate specific issue with the command arguments or repository state |
31a89587eb04
FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
423
diff
changeset
|
148 */ |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
149 public void execute() throws HgMissingConfigElementException, HgIOException, HgException { |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
150 try { |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
151 ConfigFile cfgRead = new ConfigFile(sessionCtx); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
152 cfgRead.addLocation(configFile); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
153 ConfigFileParser cfgWrite = new ConfigFileParser(); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
154 FileInputStream fis = new FileInputStream(configFile); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
155 cfgWrite.parse(fis); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
156 fis.close(); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
157 for (Operation op : changes) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
158 if (!ignoreMissingKeys && !cfgRead.hasSection(op.section)) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
159 throw new HgMissingConfigElementException("Bad section name", op.section, op.key); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
160 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
161 Map<String, String> sect = cfgRead.getSection(op.section); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
162 if (!ignoreMissingKeys && !sect.containsKey(op.key)) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
163 throw new HgMissingConfigElementException("Bad key name", op.section, op.key); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
164 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
165 String oldValue = sect.get(op.key); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
166 if (oldValue == null) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
167 oldValue = ""; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
168 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
169 switch (op.kind) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
170 case AddValue: { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
171 String separator = ", "; // XXX shall parse and find out separator kind in use |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
172 String newValue = oldValue + separator + op.value; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
173 if (sect.containsKey(op.key)) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
174 cfgWrite.change(op.section, op.key, newValue); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
175 } else { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
176 cfgWrite.add(op.section, op.key, newValue); |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
177 } |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
178 break; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
179 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
180 case DelValue: { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
181 if (!ignoreMissingKeys && (oldValue.length() == 0 || !oldValue.contains(op.value))) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
182 throw new HgMissingConfigElementException(String.format("Bad value '%s' to delete from '%s'", op.value, oldValue), op.section, op.key); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
183 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
184 int start = oldValue.indexOf(op.value); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
185 if (start == -1) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
186 // nothing to change |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
187 break; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
188 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
189 int commaPos = -1; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
190 for (int i = start-1; i >=0; i--) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
191 if (oldValue.charAt(i) == ',') { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
192 commaPos = i; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
193 break; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
194 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
195 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
196 for (int i = start + op.value.length(); commaPos == -1 && i < oldValue.length(); i++) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
197 if (oldValue.charAt(i) == ',') { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
198 commaPos = i; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
199 break; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
200 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
201 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
202 String newValue; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
203 if (commaPos >= 0) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
204 if (commaPos < start) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
205 // from preceding comma up to end of value |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
206 newValue = oldValue.substring(0, commaPos) + oldValue.substring(start + op.value.length()); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
207 } else { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
208 // from value start up to and including subsequent comma |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
209 newValue = oldValue.substring(0, start) + oldValue.substring(commaPos+1); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
210 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
211 } else { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
212 // found no separator, just remove the value |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
213 // extra whitespaces (if space, not a comma is a separator) won't hurt |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
214 newValue = oldValue.substring(0, start) + oldValue.substring(start + op.value.length()); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
215 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
216 cfgWrite.change(op.section, op.key, newValue); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
217 break; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
218 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
219 case SetValue: { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
220 if (sect.containsKey(op.key)) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
221 cfgWrite.change(op.section, op.key, op.value); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
222 } else { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
223 cfgWrite.add(op.section, op.key, op.value); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
224 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
225 break; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
226 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
227 case DelEntry: { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
228 cfgWrite.delete(op.section, op.key); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
229 break; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
230 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
231 default: throw new HgInvalidStateException(String.format("Unknown change %s", op.kind)); |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
232 } |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
233 } |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
234 FileOutputStream fos = new FileOutputStream(configFile); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
235 cfgWrite.update(fos); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
236 fos.close(); |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
237 } catch (IOException ex) { |
427
31a89587eb04
FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
423
diff
changeset
|
238 String m = String.format("Failed to update configuration file %s", configFile); |
31a89587eb04
FIXMEs: consistent names, throws for commands and their handlers. Use of checked exceptions in hi-level api
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
423
diff
changeset
|
239 throw new HgBadArgumentException(m, ex); // TODO [post-1.0] better exception, it's not bad argument case |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
240 } |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
241 } |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
242 |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
243 private static void checkSection(String section) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
244 if (section == null || section.trim().length() == 0) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
245 throw new IllegalArgumentException(String.format("Section name can't be empty: %s", section)); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
246 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
247 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
248 |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
249 private static void checkKey(String key) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
250 if (key == null || key.trim().length() == 0) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
251 throw new IllegalArgumentException(String.format("Entry key can't be empty: %s", key)); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
252 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
253 } |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
254 |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
255 |
498
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
256 private static class Operation { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
257 private enum OpKind { AddValue, SetValue, DelValue, DelEntry }; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
258 |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
259 public final OpKind kind; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
260 public final String section; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
261 public final String key; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
262 public final String value; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
263 |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
264 private Operation(OpKind t, String s, String k, String v) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
265 kind = t; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
266 section = s; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
267 key = k; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
268 value = v; |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
269 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
270 |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
271 public static Operation deleteEntry(String section, String key) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
272 return new Operation(OpKind.DelEntry, section, key, null); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
273 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
274 public static Operation deleteValue(String section, String key, String value) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
275 if (value == null || value.trim().length() == 0) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
276 throw new IllegalArgumentException(String.format("Can't remove empty value '%s'", value)); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
277 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
278 return new Operation(OpKind.DelValue, section, key, value); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
279 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
280 public static Operation addValue(String section, String key, String value) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
281 if (value == null || value.trim().length() == 0) { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
282 throw new IllegalArgumentException(String.format("Can't add empty value '%s'", value)); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
283 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
284 return new Operation(OpKind.AddValue, section, key, value); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
285 } |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
286 public static Operation setValue(String section, String key, String value) throws IllegalArgumentException { |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
287 return new Operation(OpKind.SetValue, section, key, value); |
0205a5c4566b
Issue 38: preserve user formatting and comments when updating configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
493
diff
changeset
|
288 } |
378
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
289 } |
9fb990c8a724
Investigate approaches to alter Mercurial configuration files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
290 } |