diff --git a/README.md b/README.md
index 27b07e1..6905d16 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@ External runtime libraries (including mirthsync) are copied to `mirthsync-plugin
- Access to a Mirth Connect or Open Integration Engine 4.5.2 or 4.6.0 environment (the exact versions listed in `mirth.plugin.compatible_versions` in `pom.xml`)
- Optional: custom signing certificate/keystore (default self-signed cert lives in `certificate/keystore.jks`; password is `storepass` and alias `selfsigned`)
-The plugin depends on [`com.saga-it:mirthsync`](https://clojars.org/com.saga-it/mirthsync), which is published on [Clojars](https://clojars.org) and resolved automatically during the Maven build. The embedded CLI version is pinned in `server/pom.xml` and `client/pom.xml` (currently **3.7.0**); bump both together, and publish that mirthsync release to Clojars first.
+The plugin depends on [`com.saga-it:mirthsync`](https://clojars.org/com.saga-it/mirthsync), which is published on [Clojars](https://clojars.org) and resolved automatically during the Maven build. The embedded CLI version is pinned in `server/pom.xml` and `client/pom.xml` (currently **3.8.1**); bump both together, and publish that mirthsync release to Clojars first.
---
@@ -95,6 +95,7 @@ From **Settings → MirthSync** inside the Administrator UI:
- **Flags & Toggles**
- Includes mirthsync options like `--force`, `--include-configuration-map`, `--git-init`, `--delete-orphaned`, etc.
- Deploy after push: “Deploy channels after push” (`--deploy`), “Deploy all together” (`--deploy-all`), “Deploy only changed channels” (`--deploy-changed`, mirthsync 3.7.0+) and, with it, “Also deploy new channels” (`--deploy-new`).
+ - “Sort unordered collections” (on by default, mirthsync 3.8.0+): on pull, sorts collections Mirth stores in no fixed order (code template context types, library/alert channel IDs, the configuration map, etc.) so pulled XML stays stable and diffs stay clean. Uncheck it to keep the server's order (`--no-sort-unordered`). Expect a one-time commit that only reorders elements the first time you pull with “Force overwrite” checked after upgrading; without it, a pull does not overwrite existing files.
- “Allow interactive prompts” is currently disabled with a tooltip (“Currently unsupported”).
- **Git Metadata & Commands**
diff --git a/client/pom.xml b/client/pom.xml
index f0c9755..b4204bf 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -24,7 +24,7 @@
com.saga-it
mirthsync-plugin
- 0.0.5
+ 0.0.6
client
@@ -51,7 +51,7 @@
com.saga-it
mirthsync
- 3.7.0
+ 3.8.1
diff --git a/client/src/main/java/com/saga_it/mirthsync_plugin/client/panel/MainSettingsPanel.java b/client/src/main/java/com/saga_it/mirthsync_plugin/client/panel/MainSettingsPanel.java
index 129f9bb..b745507 100644
--- a/client/src/main/java/com/saga_it/mirthsync_plugin/client/panel/MainSettingsPanel.java
+++ b/client/src/main/java/com/saga_it/mirthsync_plugin/client/panel/MainSettingsPanel.java
@@ -88,6 +88,7 @@ public class MainSettingsPanel extends AbstractSettingsPanel {
private MirthCheckBox autoCommitCheckbox;
private MirthCheckBox gitInitCheckbox;
private MirthCheckBox deleteOrphanedCheckbox;
+ private MirthCheckBox sortUnorderedCheckbox;
private MirthTextField commitMessageField;
private MirthTextField gitAuthorField;
@@ -128,6 +129,7 @@ public class MainSettingsPanel extends AbstractSettingsPanel {
Keys.AUTO_COMMIT,
Keys.GIT_INIT,
Keys.DELETE_ORPHANED,
+ Keys.SORT_UNORDERED,
Keys.COMMIT_MESSAGE,
Keys.GIT_AUTHOR,
Keys.GIT_EMAIL,
@@ -313,6 +315,9 @@ private JPanel buildOptionsPanel() {
autoCommitCheckbox = createCheckBox("Auto commit after operations");
gitInitCheckbox = createCheckBox("Initialise git repository if missing");
deleteOrphanedCheckbox = createCheckBox("Delete orphaned files on pull");
+ sortUnorderedCheckbox = createCheckBox("Sort unordered collections");
+ sortUnorderedCheckbox.setSelected(true);
+ sortUnorderedCheckbox.setToolTipText("On pull, sort collections Mirth stores in no fixed order so the XML stays stable and diffs stay clean. Uncheck to keep the server's order (--no-sort-unordered).");
registerCheckboxListener(forceCheckbox);
registerCheckboxListener(includeConfigurationMapCheckbox);
registerCheckboxListener(skipDisabledCheckbox);
@@ -346,6 +351,7 @@ private JPanel buildOptionsPanel() {
registerCheckboxListener(autoCommitCheckbox);
registerCheckboxListener(gitInitCheckbox);
registerCheckboxListener(deleteOrphanedCheckbox);
+ registerCheckboxListener(sortUnorderedCheckbox);
panel.add(forceCheckbox, "growx");
panel.add(includeConfigurationMapCheckbox, "growx, wrap");
@@ -370,6 +376,7 @@ private JPanel buildOptionsPanel() {
panel.add(gitInitCheckbox, "growx, wrap");
panel.add(deleteOrphanedCheckbox, "growx");
+ panel.add(sortUnorderedCheckbox, "growx, wrap");
return panel;
}
@@ -664,6 +671,7 @@ private Map createEmptyPreset() {
preset.put(Keys.AUTO_COMMIT, Boolean.FALSE.toString());
preset.put(Keys.GIT_INIT, Boolean.FALSE.toString());
preset.put(Keys.DELETE_ORPHANED, Boolean.FALSE.toString());
+ preset.put(Keys.SORT_UNORDERED, Boolean.TRUE.toString());
preset.put(Keys.COMMIT_MESSAGE, "mirthsync commit");
preset.put(Keys.GIT_AUTHOR, "");
preset.put(Keys.GIT_EMAIL, "");
@@ -950,6 +958,7 @@ private Map snapshotCurrentSettings() {
snapshot.put(Keys.AUTO_COMMIT, Boolean.toString(autoCommitCheckbox.isSelected()));
snapshot.put(Keys.GIT_INIT, Boolean.toString(gitInitCheckbox.isSelected()));
snapshot.put(Keys.DELETE_ORPHANED, Boolean.toString(deleteOrphanedCheckbox.isSelected()));
+ snapshot.put(Keys.SORT_UNORDERED, Boolean.toString(sortUnorderedCheckbox.isSelected()));
snapshot.put(Keys.COMMIT_MESSAGE, textOrEmpty(commitMessageField));
snapshot.put(Keys.GIT_AUTHOR, textOrEmpty(gitAuthorField));
snapshot.put(Keys.GIT_EMAIL, textOrEmpty(gitEmailField));
@@ -1012,6 +1021,7 @@ private void applyPresetValues(Map preset) {
autoCommitCheckbox.setSelected(Boolean.parseBoolean(preset.getOrDefault(Keys.AUTO_COMMIT, "false")));
gitInitCheckbox.setSelected(Boolean.parseBoolean(preset.getOrDefault(Keys.GIT_INIT, "false")));
deleteOrphanedCheckbox.setSelected(Boolean.parseBoolean(preset.getOrDefault(Keys.DELETE_ORPHANED, "false")));
+ sortUnorderedCheckbox.setSelected(parseBooleanOrDefault(preset.get(Keys.SORT_UNORDERED), true));
commitMessageField.setText(preset.getOrDefault(Keys.COMMIT_MESSAGE, "mirthsync commit"));
@@ -1032,6 +1042,18 @@ private void applyPresetValues(Map preset) {
setSaveEnabled(true);
}
+ /**
+ * For settings added after presets/properties were first saved: a missing
+ * key, or the blank value serializePresetValues writes for one, means the
+ * default rather than false.
+ */
+ private boolean parseBooleanOrDefault(String value, boolean defaultValue) {
+ if (isBlank(value)) {
+ return defaultValue;
+ }
+ return Boolean.parseBoolean(value.trim());
+ }
+
private int parseIntOrDefault(String value, int defaultValue) {
if (isBlank(value)) {
return defaultValue;
@@ -1356,6 +1378,8 @@ private List buildExecutionArguments() {
addFlag(args, autoCommitCheckbox.isSelected(), "--auto-commit");
addFlag(args, gitInitCheckbox.isSelected(), "--git-init");
addFlag(args, deleteOrphanedCheckbox.isSelected(), "--delete-orphaned");
+ // Sorting is mirthsync's default (3.8.0+), so only the opt-out is passed.
+ addFlag(args, !sortUnorderedCheckbox.isSelected(), "--no-sort-unordered");
args.add(actionOption.getCliValue());
@@ -1860,6 +1884,7 @@ private static final class Keys {
static final String AUTO_COMMIT = "autoCommit";
static final String GIT_INIT = "gitInit";
static final String DELETE_ORPHANED = "deleteOrphaned";
+ static final String SORT_UNORDERED = "sortUnordered";
static final String COMMIT_MESSAGE = "commitMessage";
static final String GIT_AUTHOR = "gitAuthor";
static final String GIT_EMAIL = "gitEmail";
@@ -2149,6 +2174,7 @@ public void doRefresh() {
autoCommitCheckbox.setSelected(Boolean.parseBoolean(properties.getProperty(Keys.AUTO_COMMIT, "false")));
gitInitCheckbox.setSelected(Boolean.parseBoolean(properties.getProperty(Keys.GIT_INIT, "false")));
deleteOrphanedCheckbox.setSelected(Boolean.parseBoolean(properties.getProperty(Keys.DELETE_ORPHANED, "false")));
+ sortUnorderedCheckbox.setSelected(parseBooleanOrDefault(properties.getProperty(Keys.SORT_UNORDERED), true));
commitMessageField.setText(properties.getProperty(Keys.COMMIT_MESSAGE, "mirthsync commit"));
gitAuthorField.setText(properties.getProperty(Keys.GIT_AUTHOR, ""));
@@ -2202,6 +2228,7 @@ private Properties buildProperties() {
properties.setProperty(Keys.AUTO_COMMIT, Boolean.toString(autoCommitCheckbox.isSelected()));
properties.setProperty(Keys.GIT_INIT, Boolean.toString(gitInitCheckbox.isSelected()));
properties.setProperty(Keys.DELETE_ORPHANED, Boolean.toString(deleteOrphanedCheckbox.isSelected()));
+ properties.setProperty(Keys.SORT_UNORDERED, Boolean.toString(sortUnorderedCheckbox.isSelected()));
properties.setProperty(Keys.COMMIT_MESSAGE, textOrEmpty(commitMessageField));
properties.setProperty(Keys.GIT_AUTHOR, textOrEmpty(gitAuthorField));
diff --git a/pom.xml b/pom.xml
index 84889fc..e869392 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
com.saga-it
mirthsync-plugin
- 0.0.5
+ 0.0.6
pom
https://saga-it.com/products/mirthsync-plugin
diff --git a/server/pom.xml b/server/pom.xml
index 6ad7954..879e491 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -24,7 +24,7 @@
com.saga-it
mirthsync-plugin
- 0.0.5
+ 0.0.6
server
@@ -232,7 +232,7 @@
com.saga-it
mirthsync
- 3.7.0
+ 3.8.1
diff --git a/shared/pom.xml b/shared/pom.xml
index d4ef351..4fe5b0b 100644
--- a/shared/pom.xml
+++ b/shared/pom.xml
@@ -24,7 +24,7 @@
com.saga-it
mirthsync-plugin
- 0.0.5
+ 0.0.6