Eskil

Check-in [55d06d0197]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Support multiple plugins.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 55d06d0197be87e6a43701e479d0686f401557487c0cd3dc5a0d207a75eea8af
User & Date: peter 2017-12-02 02:54:19.647
Context
2017-12-04
21:51
Use newer packages. check-in: 57967f90ad user: peter tags: trunk
2017-12-02
02:54
Support multiple plugins. check-in: 55d06d0197 user: peter tags: trunk
01:18
Changed default pivot to 10. Include GUI choice for 1. check-in: 417dbf4903 user: peter tags: trunk
Changes
Unified Diff Ignore Whitespace Patch
Changes to Changes.
1

2
3
4
5
6
7
8
2017-12-02

 Changed default pivot to 10. Include GUI choice for 1.

2017-12-01
 Added GUI for multiple plugins. No function yet.

Released 2.7.4


>







1
2
3
4
5
6
7
8
9
2017-12-02
 Support multiple plugins.
 Changed default pivot to 10. Include GUI choice for 1.

2017-12-01
 Added GUI for multiple plugins. No function yet.

Released 2.7.4

Changes to src/eskil.tcl.
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
    if {$i >= 0} {
        incr i
        lset ::eskil(argv) $i $::eskil($top,separatorview)
    } else {
        lappend ::eskil(argv) -sep $::eskil($top,separatorview)
    }
    # Prepare plugin
    if {$::eskil($top,plugin) ne "" && \
                [dict get $::eskil($top,pluginpinfo) file]} {
        preparePlugin $top
        set ::eskil($top,cleanup) "plugin $::eskil($top,cleanup)"
    }
}

# Clean up after a diff
proc cleanupFiles {top} {







|
|







1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
    if {$i >= 0} {
        incr i
        lset ::eskil(argv) $i $::eskil($top,separatorview)
    } else {
        lappend ::eskil(argv) -sep $::eskil($top,separatorview)
    }
    # Prepare plugin
    if {$::eskil($top,plugin,1) ne "" && \
                [dict get $::eskil($top,pluginpinfo,1) file]} {
        preparePlugin $top
        set ::eskil($top,cleanup) "plugin $::eskil($top,cleanup)"
    }
}

# Clean up after a diff
proc cleanupFiles {top} {
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
    set ::eskil($top,ancestorFile) ""
    set ::eskil($top,separator) ""
    set ::eskil($top,separatorview) ""
    set ::eskil($top,conflictFile) ""
    set ::eskil($top,limitlines) 0
    set ::eskil($top,gz) 0
    set ::eskil($top,maxwidth) 0
    set ::eskil($top,plugin) ""

    # Copy the collected options from command line
    foreach {item val} $::eskil(defaultopts) {
        set ::eskil($top,$item) $val
    }
}








|







2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
    set ::eskil($top,ancestorFile) ""
    set ::eskil($top,separator) ""
    set ::eskil($top,separatorview) ""
    set ::eskil($top,conflictFile) ""
    set ::eskil($top,limitlines) 0
    set ::eskil($top,gz) 0
    set ::eskil($top,maxwidth) 0
    set ::eskil($top,plugin,1) ""

    # Copy the collected options from command line
    foreach {item val} $::eskil(defaultopts) {
        set ::eskil($top,$item) $val
    }
}

Changes to src/plugin.tcl.
199
200
201
202
203
204
205






206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274

275


276
277
278
279
280

281


282
283
284




285
286
287
288
289
290
291
        set descr [dict get $info descr]
        puts "Plugin [format %-*s $w \"$plugin\"] : $descr"
    }
}

proc preparePlugin {top} {
    disallowEdit $top






    set allow [dict get $::eskil($top,pluginpinfo) allow]
    # Pass ::argv to plugin
    set pArgv $::eskil(argv)
    if {[info exists ::eskil($top,pluginargv)]} {
        lappend pArgv {*}$::eskil($top,pluginargv)
    }
    $::eskil($top,plugin) eval [list set ::argv $pArgv]
    # Pass ::Pref to plugin
    $::eskil($top,plugin) eval [list array set ::Pref [array get ::Pref]]
    # Pass File info to plugin
    $::eskil($top,plugin) eval [list set ::File(left)  $::eskil($top,leftFile)]
    $::eskil($top,plugin) eval [list set ::File(right) $::eskil($top,rightFile)]

    set out1 [tmpFile]
    set out2 [tmpFile]

    set chi [open $::eskil($top,leftFile) r]
    set cho [open $out1 w]
    set chi2 [open $::eskil($top,rightFile) r]
    set cho2 [open $out2 w]
    interp share {} $chi $::eskil($top,plugin)
    interp share {} $cho $::eskil($top,plugin)
    interp share {} $chi2 $::eskil($top,plugin)
    interp share {} $cho2 $::eskil($top,plugin)

    set cmd1 [list PreProcess left $chi $cho]
    set cmd2 [list PreProcess right $chi2 $cho2]
    if {[info commands yield] ne ""} {
        # When in 8.6, this is done in coroutines allowing each call
        # to yield and to alternate between them until done
        set c1 __plugin_cr1$top
        set c2 __plugin_cr2$top
        set cmd1 [linsert $cmd1 0 coroutine $c1]
        set cmd2 [linsert $cmd2 0 coroutine $c2]
        set usenew1 [$::eskil($top,plugin) eval $cmd1]
        set usenew2 [$::eskil($top,plugin) eval $cmd2]
        interp alias {} pnw $::eskil($top,plugin) namespace which
        while {[pnw $c1] ne {} || [pnw $c2] ne {}} {
            if {[pnw $c1] ne {}} {
                set usenew1 [$::eskil($top,plugin) eval $c1]
            }
            if {[pnw $c2] ne {}} {
                set usenew2 [$::eskil($top,plugin) eval $c2]
            }
        }
    } else {
        set usenew1 [$::eskil($top,plugin) eval $cmd1]
        set usenew2 [$::eskil($top,plugin) eval $cmd2]
    }

    if {$allow} {
        $::eskil($top,plugin) eval close $chi
        $::eskil($top,plugin) eval close $cho
        $::eskil($top,plugin) eval close $chi2
        $::eskil($top,plugin) eval close $cho2
    } else {
        $::eskil($top,plugin) invokehidden close $chi
        $::eskil($top,plugin) invokehidden close $cho
        $::eskil($top,plugin) invokehidden close $chi2
        $::eskil($top,plugin) invokehidden close $cho2
    }
    close $chi
    close $cho
    close $chi2
    close $cho2

    if {$usenew1} {
        # The file after processing should be used both
        # for comparison and for displaying.

        set ::eskil($top,leftFileBak) $::eskil($top,leftFile)


        set ::eskil($top,leftFile) $out1
    } else {
        set ::eskil($top,leftFileDiff) $out1
    }
    if {$usenew2} {

        set ::eskil($top,rightFileBak) $::eskil($top,rightFile)


        set ::eskil($top,rightFile) $out2
    } else {
        set ::eskil($top,rightFileDiff) $out2




    }
}

proc cleanupPlugin {top} {
    if {[info exists ::eskil($top,leftFileBak)]} {
        set ::eskil($top,leftFile) $::eskil($top,leftFileBak)
    }







>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|

|
|

|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
>
|
>
>
|
|
|
|
|
>
|
>
>
|
|
|
>
>
>
>







199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
        set descr [dict get $info descr]
        puts "Plugin [format %-*s $w \"$plugin\"] : $descr"
    }
}

proc preparePlugin {top} {
    disallowEdit $top
    set in1 $::eskil($top,leftFile)
    set in2 $::eskil($top,rightFile)

    foreach item [array names ::eskil $top,pluginname,*] {
        set n [lindex [split $item ","] end]

        set allow [dict get $::eskil($top,pluginpinfo,$n) allow]
        # Pass ::argv to plugin
        set pArgv $::eskil(argv)
        if {[info exists ::eskil($top,pluginargv,$n)]} {
            lappend pArgv {*}$::eskil($top,pluginargv,$n)
        }
        $::eskil($top,plugin,$n) eval [list set ::argv $pArgv]
        # Pass ::Pref to plugin
        $::eskil($top,plugin,$n) eval [list array set ::Pref [array get ::Pref]]
        # Pass File info to plugin
        $::eskil($top,plugin,$n) eval [list set ::File(left)  $::eskil($top,leftFile)]
        $::eskil($top,plugin,$n) eval [list set ::File(right) $::eskil($top,rightFile)]

        set out1 [tmpFile]
        set out2 [tmpFile]

        set chi [open $in1 r]
        set cho [open $out1 w]
        set chi2 [open $in2 r]
        set cho2 [open $out2 w]
        interp share {} $chi $::eskil($top,plugin,$n)
        interp share {} $cho $::eskil($top,plugin,$n)
        interp share {} $chi2 $::eskil($top,plugin,$n)
        interp share {} $cho2 $::eskil($top,plugin,$n)

        set cmd1 [list PreProcess left $chi $cho]
        set cmd2 [list PreProcess right $chi2 $cho2]
        if {[info commands yield] ne ""} {
            # When in 8.6, this is done in coroutines allowing each call
            # to yield and to alternate between them until done
            set c1 __plugin_cr1$top
            set c2 __plugin_cr2$top
            set cmd1 [linsert $cmd1 0 coroutine $c1]
            set cmd2 [linsert $cmd2 0 coroutine $c2]
            set usenew1 [$::eskil($top,plugin,$n) eval $cmd1]
            set usenew2 [$::eskil($top,plugin,$n) eval $cmd2]
            interp alias {} pnw $::eskil($top,plugin,$n) namespace which
            while {[pnw $c1] ne {} || [pnw $c2] ne {}} {
                if {[pnw $c1] ne {}} {
                    set usenew1 [$::eskil($top,plugin,$n) eval $c1]
                }
                if {[pnw $c2] ne {}} {
                    set usenew2 [$::eskil($top,plugin,$n) eval $c2]
                }
            }
        } else {
            set usenew1 [$::eskil($top,plugin,$n) eval $cmd1]
            set usenew2 [$::eskil($top,plugin,$n) eval $cmd2]
        }

        if {$allow} {
            $::eskil($top,plugin,$n) eval close $chi
            $::eskil($top,plugin,$n) eval close $cho
            $::eskil($top,plugin,$n) eval close $chi2
            $::eskil($top,plugin,$n) eval close $cho2
        } else {
            $::eskil($top,plugin,$n) invokehidden close $chi
            $::eskil($top,plugin,$n) invokehidden close $cho
            $::eskil($top,plugin,$n) invokehidden close $chi2
            $::eskil($top,plugin,$n) invokehidden close $cho2
        }
        close $chi
        close $cho
        close $chi2
        close $cho2

        if {$usenew1} {
            # The file after processing should be used both
            # for comparison and for displaying.
            if {![info exists ::eskil($top,leftFileBak)]} {
                set ::eskil($top,leftFileBak) $::eskil($top,leftFile)
            }
            unset -nocomplain ::eskil($top,leftFileDiff)
            set ::eskil($top,leftFile) $out1
        } else {
            set ::eskil($top,leftFileDiff) $out1
        }
        if {$usenew2} {
            if {![info exists ::eskil($top,rightFileBak)]} {
                set ::eskil($top,rightFileBak) $::eskil($top,rightFile)
            }
            unset -nocomplain ::eskil($top,rightFileDiff)
            set ::eskil($top,rightFile) $out2
        } else {
            set ::eskil($top,rightFileDiff) $out2
        }
        # For next plugin, if any
        set in1 $out1
        set in2 $out2
    }
}

proc cleanupPlugin {top} {
    if {[info exists ::eskil($top,leftFileBak)]} {
        set ::eskil($top,leftFile) $::eskil($top,leftFileBak)
    }
534
535
536
537
538
539
540
541


542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563

564
565
566
567
568
569
570
        if {$n >= $t} {
            unset ::eskil($top,pluginname,$n)
            set ::eskil($top,plugininfo,$n) ""
            set ::eskil($top,pluginallow,$n) 0
        }
    }

    # TBD PLUGIN: Actually use multiple


    if {$::eskil($top,pluginname,1) ne ""} {
        set pinterp [createPluginInterp $::eskil($top,pluginname,1) \
                             $::eskil($top,plugininfo,1) \
                             $::eskil($top,pluginallow,1) pinfo]
    } else {
        set pinterp ""
        set pinfo ""
    }
    set ::eskil($top,plugin) $pinterp
    set ::eskil($top,pluginpinfo) $pinfo
    set ::eskil($top,pluginargv) {}
    foreach {name flag doc} $::eskil($top,edit,opts,1) {
        if {$flag} {
            if {[info exists ::eskil($top,edit,$name,1)] && \
                        $::eskil($top,edit,$name,1)} {
                lappend ::eskil($top,pluginargv) $name
            }
        } else {
            if {[info exists ::eskil($top,edit,$name,1)] && \
                        $::eskil($top,edit,$name,1) ne ""} {
                lappend ::eskil($top,pluginargv) $name \
                        $::eskil($top,edit,$name,1)

            }
        }
    }
}

# Put Tcl code in a text widget, with some syntax highlighting
proc TextViewTcl {t data} {







|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>







550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
        if {$n >= $t} {
            unset ::eskil($top,pluginname,$n)
            set ::eskil($top,plugininfo,$n) ""
            set ::eskil($top,pluginallow,$n) 0
        }
    }

    # Handle all plugins
    foreach item [array names ::eskil $top,pluginname,*] {
        set n [lindex [split $item ","] end]
        if {$::eskil($top,pluginname,$n) ne ""} {
            set pinterp [createPluginInterp $::eskil($top,pluginname,$n) \
                                 $::eskil($top,plugininfo,$n) \
                                 $::eskil($top,pluginallow,$n) pinfo]
        } else {
            set pinterp ""
            set pinfo ""
        }
        set ::eskil($top,plugin,$n) $pinterp
        set ::eskil($top,pluginpinfo,$n) $pinfo
        set ::eskil($top,pluginargv,$n) {}
        foreach {name flag doc} $::eskil($top,edit,opts,$n) {
            if {$flag} {
                if {[info exists ::eskil($top,edit,$name,$n)] && \
                            $::eskil($top,edit,$name,$n)} {
                    lappend ::eskil($top,pluginargv,$n) $name
                }
            } else {
                if {[info exists ::eskil($top,edit,$name,$n)] && \
                            $::eskil($top,edit,$name,$n) ne ""} {
                    lappend ::eskil($top,pluginargv,$n) $name \
                            $::eskil($top,edit,$name,$n)
                }
            }
        }
    }
}

# Put Tcl code in a text widget, with some syntax highlighting
proc TextViewTcl {t data} {
Changes to src/startup.tcl.
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
        close $ch
    }

    # Get all other source files
    InitReSource

    # Diff functionality is in the DiffUtil package.
    package require DiffUtil
    # Help DiffUtil to find a diff executable, if needed
    catch {DiffUtil::LocateDiffExe $::eskil(thisScript)}

    # Create font for PDF
    if {$::Pref(printFont) eq ""} {
        set fontfile $::eskil(thisDir)/embedfont.ttf
    } else {







|







81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
        close $ch
    }

    # Get all other source files
    InitReSource

    # Diff functionality is in the DiffUtil package.
    package require DiffUtil 0.4
    # Help DiffUtil to find a diff executable, if needed
    catch {DiffUtil::LocateDiffExe $::eskil(thisScript)}

    # Create font for PDF
    if {$::Pref(printFont) eq ""} {
        set fontfile $::eskil(thisDir)/embedfont.ttf
    } else {
921
922
923
924
925
926
927

928
929
930
931
932
933
934
935
936
937
938
939
        set pinterp [createPluginInterp $plugin $plugininfo $pluginallow pinfo]
        if {$pinterp eq ""} {
            # This should not happen since the validator should handle it
            puts "Bad plugin: $plugin"
            printPlugins
            exit
        }

        set opts(plugin) $pinterp
        set opts(pluginname,1) $plugin
        set opts(pluginallow,1) $pluginallow
        set opts(plugininfo,1) $plugininfo
        set opts(pluginpinfo) $pinfo
    }

    # Store the command line given opts
    set ::eskil(defaultopts) [array get opts]

    # Do we start in clip diff mode?
    if {$doclip} {







>
|



|







921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
        set pinterp [createPluginInterp $plugin $plugininfo $pluginallow pinfo]
        if {$pinterp eq ""} {
            # This should not happen since the validator should handle it
            puts "Bad plugin: $plugin"
            printPlugins
            exit
        }
        # TBD: Support multiple plugins on command line.
        set opts(plugin,1) $pinterp
        set opts(pluginname,1) $plugin
        set opts(pluginallow,1) $pluginallow
        set opts(plugininfo,1) $plugininfo
        set opts(pluginpinfo,1) $pinfo
    }

    # Store the command line given opts
    set ::eskil(defaultopts) [array get opts]

    # Do we start in clip diff mode?
    if {$doclip} {