commit 44ad8f036165a5086298de26f5a75fd6588a0da7
Author: Oswald Buddenhagen <o...@users.sf.net>
Date:   Thu Jan 13 14:05:45 2022 +0100

    handle mixing simple and compound sync options more explicitly

 src/config.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/config.c b/src/config.c
index 8aa9f2e7..1f423c6a 100644
--- a/src/config.c
+++ b/src/config.c
@@ -324,18 +324,30 @@ merge_ops( int cops, int ops[], const char *chan_name )
                                return 1;
                        }
                        // Mix in non-overlapping Push/Pull or New, etc.
-                       // Do the ops first, so e.g. PullNew Push Flags will 
error out.
-                       ops[F] |= cops & OP_MASK_TYPE;
-                       ops[N] |= cops & OP_MASK_TYPE;
                        if (cops & XOP_PULL) {
+                               if (cops & (XOP_PUSH | OP_MASK_TYPE)) {
+                                       // Mixing instant effect flags with 
row/column flags would be confusing,
+                                       // so instead everything is instant 
effect. This implies that mixing
+                                       // direction with type would cause 
overlaps, so PullNew Push Delete, etc.
+                                       // is invalid.
+                                       // Pull Push covers everything, so 
makes no sense to combine.
+                                 ivl:
+                                       error( "Invalid combination of simple 
and compound Sync options %s.\n",
+                                              channel_str( chan_name ) );
+                                       return 1;
+                               }
                                if (ops[N] & OP_MASK_TYPE)
                                        goto ovl;
                                ops[N] |= OP_MASK_TYPE;
-                       }
-                       if (cops & XOP_PUSH) {
+                       } else if (cops & XOP_PUSH) {
+                               if (cops & OP_MASK_TYPE)
+                                       goto ivl;
                                if (ops[F] & OP_MASK_TYPE)
                                        goto ovl;
                                ops[F] |= OP_MASK_TYPE;
+                       } else {
+                               ops[F] |= cops & OP_MASK_TYPE;
+                               ops[N] |= cops & OP_MASK_TYPE;
                        }
                } else if (cops & (OP_MASK_TYPE | XOP_MASK_DIR)) {  // Pull 
New, etc.
                        if (ops[F] & XOP_TYPE_NOOP)


_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to