-
Notifications
You must be signed in to change notification settings - Fork 0
/
vpacman.tcl
12294 lines (11346 loc) · 527 KB
/
vpacman.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
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
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
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
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" -- "$@"
# we use this construct for two main reasons:
# first, the location of the wish binary can be anywhere in your shell search path
# second, the "--" addition prevents wish from intercepting any arguments/options passed to it.
# for example without the "--":
# -h -help would return wish help
# -d -display would open the wish window on the display indicated
# This is Vpacman - a Graphical front end for pacman and the AUR
#
# Copyright (C) 2018 - 2022 Andrew Myers <andrew dot myers@wanadoo dot fr>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# set the version number
set version "1.4.7"
# save any arguments passed to vpacman
set args $argv
# run some tests on the arguments passed to vpacman.tcl
set debug ""
set usage_error false
set usage_help false
foreach item $args {
# keep the "debug" option for backward compatability
switch -- $item {
-d -
--debug -
debug {
set debug "low"
}
-dd {
set debug "medium"
}
-ddd {
set debug "high"
}
-h -
--help {
set usage_help true
}
-dh -
-hd {
set debug "low"
set usage_help true
}
-ddh -
-hdd {
set debug "medium"
set usage_help true
}
-dddh -
-hddd {
set debug "high"
set usage_help true
}
--restart {
}
default {
set usage_help true
set usage_error true
}
}
}
# set tk_messageBox defaults to a wider format
option add *Dialog.msg.wrapLength 12c
option add *Dialog.dtl.wrapLength 12c
# to reset the tk_messageBox to the default values use
#option clear
# do not throw an error if we ran vpacman.tcl from a terminal
# usage_help and usage_error have been set, so could be used later if necessary
set is_terminal [catch {exec tty -s} terminal_result]
if {$usage_help} {
if {$is_terminal == 0} {
if {$usage_help} {
puts stdout "
Usage:
vpacman \[OPTIONS\]
Run vpacman - a Graphical front end for pacman and the AUR.
Options:
-d --debug run in debug mode. Output is saved to a file \"vpacman_debug.txt\" in the users home folder.
-h --help show this help. For extended help run vpacman and select Help > Help from the menu bar.
"
}
if {$usage_error} {exit}
puts stdout "Press <Enter> to run vpacman now: "
fconfigure stdin -blocking 0; read stdin; fconfigure stdin -blocking 1
exec /bin/stty raw -echo <@stdin
set ans [read stdin 1]
exec /bin/stty -raw echo <@stdin
if {[scan $ans %c] != 10} {exit}
} else {
wm iconify .
set detail "Options:\n\n -d --debug run in debug mode. Output is saved to a file\n\t\"vpacman_debug.txt\" in the users home folder.\n -h --help show this help. For extended help run vpacman\n\tand select Help > Help from the menu bar."
set message "vpacman \[OPTIONS\]\n\nRun vpacman - a Graphical front end for pacman and the AUR."
if {$usage_error} {
tk_messageBox -default ok -detail $detail -message $message -parent . -title "Usage Error" -type ok
exit
} else {
set ans [tk_messageBox -default ok -detail $detail -message $message -icon info -parent . -title "Usage" -type okcancel]
if {$ans == "cancel"} {exit}
}
}
}
# now test the requirements to run vpacman.tcl
# check for threads
set error [catch {package require Thread}]
if {$error} {
set threads false
} else {
set threads true
}
# check for required programmes
set required "pacman wmctrl"
foreach programme $required {
set result [catch {exec which $programme}]
if {$result == 1} {
tk_messageBox -default ok -detail "$programme is required by vpacman" -icon warning -message "Failed Dependency" -parent . -title "Error" -type ok
exit
}
}
# Use wmctrl to raise an already running application
# unless we have just restarted, in which case the previous window is in the process of being closed
if {[string first "--restart" $args] == -1} {
set process [pid]
set program [file tail $argv0]
set list [split [exec ps -eo "pid cmd" | grep "$program"] \n]
foreach i $list {
if {[string first $process [string trim $i]] == 0} {continue}
if {[string first grep $i] != -1} {continue}
if {[string first "wish" $i] != -1 && [string first "$program" $i] != -1} {
catch {exec wmctrl -F -a "Vpacman"}
exit
}
}
}
# DECLARATIONS
# .. directories
global home program_dir tmp_dir
# .. configuration
global config_file
# ..configurable
global backup_dir browser buttons editor geometry geometry_view helpbg helpfg icon_dir installed_colour keep_log outdated_colour save_geometry show_menu show_buttonbar terminal terminal_string
# ..variables
global about_text after_id anchor args aur_all aur_files aur_installs aur_list aur_messages aur_only aur_updates aur_versions backup_log bubble clock_id colours count_all count_installed count_outdated count_uninstalled dataview dbpath depends_searches diffprog dlprog filter filter_list find findfile find_message findtype fs_upgrade geometry_config group group_index help_text index installed_colour is_connected known_browsers known_diffprogs known_editors known_terminals list_all list_groups list_installed list_local list_local_ids list_outdated list_repos list_show list_show_ids list_show_order list_uninstalled listfirst listlast listview_current listview_last_selected listview_selected listview_selected_in_order local_newer message mirror_countries one_time outdated_colour package_actions pacman_files_upgrade part_upgrade pkgfile_upgrade repo_delete_msg select selected_list selected_message start_time state su_cmd sync_time system_data system_test thread threads times tv_index tv_select tverr_message tverr_text upgrade_time upgrades upgrades_count version win_configx win_configy win_mainx win_mainy
# VARIABLES
# Set directories
if {[file isdirectory /home/$env(USER)] == 1} {
set home "/home/$env(USER)"
} else {
set home $env(HOME)
}
set program_dir [file dirname [info script]]
if [string equal $program_dir "."] {
set program_dir [pwd]
}
# the icons can be changed by copying the icon directory to a chosen location
# and then overwriting the icons with the preferred images of similar dimensions
# the location of the icon directory is preserved in the configuration file
set icon_dir "/usr/share/pixmaps/vpacman"
# we may need a temporary directory with more space than /tmp for aur_upgrades
# make the temporary directory if it does not already exist
# first check if the tmp directory exists before creating a new directory
if {[file isdirectory $home/.tmp/vpacman]} {
set tmp_dir "$home/.tmp/vpacman"
} elseif {[file isdirectory $home/.tmp/vpacman]} {
set tmp_dir "$home/.tmp/vpacman"
} else {
# if there is a tmp directory in the users home dirctory use that
if {[file isdirectory $home/tmp]} {
file mkdir "$home/tmp/vpacman"
set tmp_dir "$home/tmp/vpacman"
} else {
# if not then create a hidden tmp directory in the home directory and use that
file mkdir "$home/.tmp/vpacman"
set tmp_dir "$home/.tmp/vpacman"
}
}
# set other variables
# about text
set about_text "
<centre> <strong>vpacman.tcl</strong>
Version $version
A graphical front end for pacman and the AUR
This programme is free software. It is distributed under the terms of the GNU General Public Licence version 3 or any later version.
\"https://www.gnu.org/licenses/gpl.html\"
You may copy it, modify it, and/or redistribute it.
This programme comes with NO WARRANTY whatsoever, under any circumstances.
vpacman should be installed in /usr/bin and /usr/share/vpacman</centre>"
# set a dummy for the after id
set after_id ""
# anchor variable used for the alternative treeview bindings
set anchor ""
# do we want to include all the installed local packages in the aur_updates list
set aur_all false
# which files are owned by the local packages
set aur_files ""
# list any aur dependencies which need to be installed before an AUR/local package
set aur_installs ""
# list of packages available from the AUR
set aur_list ""
# do we show the warning messages in get_aur_updates or not
set aur_messages "true"
# if only aur packages are listed then set aur_only to true
set aur_only false
# these are the aur packages which could be updated
set aur_updates ""
# the versions found for the aur packages by the thread get_aur_versions
set aur_versions ""
# set the location of the backup file lists, the latest selected backup directory will be saved in the configuration file
set backup_dir $home
# keep a backup copy of the pacman log
set backup_log "yes"
# default browser
set browser ""
# toolbar button size
set buttons "medium"
# set an id for the clock update after delay
set clock_id 0
# list of all the known colours
set colours "{alice blue} {AliceBlue} {antique white} {AntiqueWhite} {AntiqueWhite1} {AntiqueWhite2} {AntiqueWhite3} {AntiqueWhite4} {aquamarine} {aquamarine1} {aquamarine2} {aquamarine3} {aquamarine4} {azure} {azure1} {azure2} {azure3} {azure4} {beige} {bisque} {bisque1} {bisque2} {bisque3} {bisque4} {black} {blanched almond} {BlanchedAlmond} {blue} {blue violet} {blue1} {blue2} {blue3} {blue4} {BlueViolet} {brown} {brown1} {brown2} {brown3} {brown4} {burlywood} {burlywood1} {burlywood2} {burlywood3} {burlywood4} {cadet blue} {CadetBlue} {CadetBlue1} {CadetBlue2} {CadetBlue3} {CadetBlue4} {chartreuse} {chartreuse1} {chartreuse2} {chartreuse3} {chartreuse4} {chocolate} {chocolate1} {chocolate2} {chocolate3} {chocolate4} {coral} {coral1} {coral2} {coral3} {coral4} {cornflower blue} {CornflowerBlue} {cornsilk} {cornsilk1} {cornsilk2} {cornsilk3} {cornsilk4} {cyan} {cyan1} {cyan2} {cyan3} {cyan4} {dark blue} {dark cyan} {dark goldenrod} {dark gray} {dark green} {dark grey} {dark khaki} {dark magenta} {dark olive green} {dark orange} {dark orchid} {dark red} {dark salmon} {dark sea green} {dark slate blue} {dark slate gray} {dark slate grey} {dark turquoise} {dark violet} {DarkBlue} {DarkCyan} {DarkGoldenrod} {DarkGoldenrod1} {DarkGoldenrod2} {DarkGoldenrod3} {DarkGoldenrod4} {DarkGray} {DarkGreen} {DarkGrey} {DarkKhaki} {DarkMagenta} {DarkOliveGreen} {DarkOliveGreen1} {DarkOliveGreen2} {DarkOliveGreen3} {DarkOliveGreen4} {DarkOrange} {DarkOrange1} {DarkOrange2} {DarkOrange3} {DarkOrange4} {DarkOrchid} {DarkOrchid1} {DarkOrchid2} {DarkOrchid3} {DarkOrchid4} {DarkRed} {DarkSalmon} {DarkSeaGreen} {DarkSeaGreen1} {DarkSeaGreen2} {DarkSeaGreen3} {DarkSeaGreen4} {DarkSlateBlue} {DarkSlateGray} {DarkSlateGray1} {DarkSlateGray2} {DarkSlateGray3} {DarkSlateGray4} {DarkSlateGrey} {DarkTurquoise} {DarkViolet} {deep pink} {deep sky blue} {DeepPink} {DeepPink1} {DeepPink2} {DeepPink3} {DeepPink4} {DeepSkyBlue} {DeepSkyBlue1} {DeepSkyBlue2} {DeepSkyBlue3} {DeepSkyBlue4} {dim gray} {dim grey} {DimGray} {DimGrey} {dodger blue} {DodgerBlue} {DodgerBlue1} {DodgerBlue2} {DodgerBlue3} {DodgerBlue4} {firebrick} {firebrick1} {firebrick2} {firebrick3} {firebrick4} {floral white} {FloralWhite} {forest green} {ForestGreen} {gainsboro} {ghost white} {GhostWhite} {gold} {gold1} {gold2} {gold3} {gold4} {goldenrod} {goldenrod1} {goldenrod2} {goldenrod3} {goldenrod4} {gray} {gray0} {gray1} {gray2} {gray3} {gray4} {gray5} {gray6} {gray7} {gray8} {gray9} {gray10} {gray11} {gray12} {gray13} {gray14} {gray15} {gray16} {gray17} {gray18} {gray19} {gray20} {gray21} {gray22} {gray23} {gray24} {gray25} {gray26} {gray27} {gray28} {gray29} {gray30} {gray31} {gray32} {gray33} {gray34} {gray35} {gray36} {gray37} {gray38} {gray39} {gray40} {gray41} {gray42} {gray43} {gray44} {gray45} {gray46} {gray47} {gray48} {gray49} {gray50} {gray51} {gray52} {gray53} {gray54} {gray55} {gray56} {gray57} {gray58} {gray59} {gray60} {gray61} {gray62} {gray63} {gray64} {gray65} {gray66} {gray67} {gray68} {gray69} {gray70} {gray71} {gray72} {gray73} {gray74} {gray75} {gray76} {gray77} {gray78} {gray79} {gray80} {gray81} {gray82} {gray83} {gray84} {gray85} {gray86} {gray87} {gray88} {gray89} {gray90} {gray91} {gray92} {gray93} {gray94} {gray95} {gray96} {gray97} {gray98} {gray99} {gray100} {green} {green yellow} {green1} {green2} {green3} {green4} {GreenYellow} {grey} {grey0} {grey1} {grey2} {grey3} {grey4} {grey5} {grey6} {grey7} {grey8} {grey9} {grey10} {grey11} {grey12} {grey13} {grey14} {grey15} {grey16} {grey17} {grey18} {grey19} {grey20} {grey21} {grey22} {grey23} {grey24} {grey25} {grey26} {grey27} {grey28} {grey29} {grey30} {grey31} {grey32} {grey33} {grey34} {grey35} {grey36} {grey37} {grey38} {grey39} {grey40} {grey41} {grey42} {grey43} {grey44} {grey45} {grey46} {grey47} {grey48} {grey49} {grey50} {grey51} {grey52} {grey53} {grey54} {grey55} {grey56} {grey57} {grey58} {grey59} {grey60} {grey61} {grey62} {grey63} {grey64} {grey65} {grey66} {grey67} {grey68} {grey69} {grey70} {grey71} {grey72} {grey73} {grey74} {grey75} {grey76} {grey77} {grey78} {grey79} {grey80} {grey81} {grey82} {grey83} {grey84} {grey85} {grey86} {grey87} {grey88} {grey89} {grey90} {grey91} {grey92} {grey93} {grey94} {grey95} {grey96} {grey97} {grey98} {grey99} {grey100} {honeydew} {honeydew1} {honeydew2} {honeydew3} {honeydew4} {hot pink} {HotPink} {HotPink1} {HotPink2} {HotPink3} {HotPink4} {indian red} {IndianRed} {IndianRed1} {IndianRed2} {IndianRed3} {IndianRed4} {ivory} {ivory1} {ivory2} {ivory3} {ivory4} {khaki} {khaki1} {khaki2} {khaki3} {khaki4} {lavender} {lavender blush} {LavenderBlush} {LavenderBlush1} {LavenderBlush2} {LavenderBlush3} {LavenderBlush4} {lawn green} {LawnGreen} {lemon chiffon} {LemonChiffon} {LemonChiffon1} {LemonChiffon2} {LemonChiffon3} {LemonChiffon4} {light blue} {light coral} {light cyan} {light goldenrod} {light goldenrod yellow} {light gray} {light green} {light grey} {light pink} {light salmon} {light sea green} {light sky blue} {light slate blue} {light slate gray} {light slate grey} {light steel blue} {light yellow} {LightBlue} {LightBlue1} {LightBlue2} {LightBlue3} {LightBlue4} {LightCoral} {LightCyan} {LightCyan1} {LightCyan2} {LightCyan3} {LightCyan4} {LightGoldenrod} {LightGoldenrod1} {LightGoldenrod2} {LightGoldenrod3} {LightGoldenrod4} {LightGoldenrodYellow} {LightGray} {LightGreen} {LightGrey} {LightPink} {LightPink1} {LightPink2} {LightPink3} {LightPink4} {LightSalmon} {LightSalmon1} {LightSalmon2} {LightSalmon3} {LightSalmon4} {LightSeaGreen} {LightSkyBlue} {LightSkyBlue1} {LightSkyBlue2} {LightSkyBlue3} {LightSkyBlue4} {LightSlateBlue} {LightSlateGray} {LightSlateGrey} {LightSteelBlue} {LightSteelBlue1} {LightSteelBlue2} {LightSteelBlue3} {LightSteelBlue4} {LightYellow} {LightYellow1} {LightYellow2} {LightYellow3} {LightYellow4} {lime green} {LimeGreen} {linen} {magenta} {magenta1} {magenta2} {magenta3} {magenta4} {maroon} {maroon1} {maroon2} {maroon3} {maroon4} {medium aquamarine} {medium blue} {medium orchid} {medium purple} {medium sea green} {medium slate blue} {medium spring green} {medium turquoise} {medium violet red} {MediumAquamarine} {MediumBlue} {MediumOrchid} {MediumOrchid1} {MediumOrchid2} {MediumOrchid3} {MediumOrchid4} {MediumPurple} {MediumPurple1} {MediumPurple2} {MediumPurple3} {MediumPurple4} {MediumSeaGreen} {MediumSlateBlue} {MediumSpringGreen} {MediumTurquoise} {MediumVioletRed} {midnight blue} {MidnightBlue} {mint cream} {MintCream} {misty rose} {MistyRose} {MistyRose1} {MistyRose2} {MistyRose3} {MistyRose4} {moccasin} {navajo white} {NavajoWhite} {NavajoWhite1} {NavajoWhite2} {NavajoWhite3} {NavajoWhite4} {navy} {navy blue} {NavyBlue} {old lace} {OldLace} {olive drab} {OliveDrab} {OliveDrab1} {OliveDrab2} {OliveDrab3} {OliveDrab4} {orange} {orange red} {orange1} {orange2} {orange3} {orange4} {OrangeRed} {OrangeRed1} {OrangeRed2} {OrangeRed3} {OrangeRed4} {orchid} {orchid1} {orchid2} {orchid3} {orchid4} {pale goldenrod} {pale green} {pale turquoise} {pale violet red} {PaleGoldenrod} {PaleGreen} {PaleGreen1} {PaleGreen2} {PaleGreen3} {PaleGreen4} {PaleTurquoise} {PaleTurquoise1} {PaleTurquoise2} {PaleTurquoise3} {PaleTurquoise4} {PaleVioletRed} {PaleVioletRed1} {PaleVioletRed2} {PaleVioletRed3} {PaleVioletRed4} {papaya whip} {PapayaWhip} {peach puff} {PeachPuff} {PeachPuff1} {PeachPuff2} {PeachPuff3} {PeachPuff4} {peru} {pink} {pink1} {pink2} {pink3} {pink4} {plum} {plum1} {plum2} {plum3} {plum4} {powder blue} {PowderBlue} {purple} {purple1} {purple2} {purple3} {purple4} {red} {red1} {red2} {red3} {red4} {rosy brown} {RosyBrown} {RosyBrown1} {RosyBrown2} {RosyBrown3} {RosyBrown4} {royal blue} {RoyalBlue} {RoyalBlue1} {RoyalBlue2} {RoyalBlue3} {RoyalBlue4} {saddle brown} {SaddleBrown} {salmon} {salmon1} {salmon2} {salmon3} {salmon4} {sandy brown} {SandyBrown} {sea green} {SeaGreen} {SeaGreen1} {SeaGreen2} {SeaGreen3} {SeaGreen4} {seashell} {seashell1} {seashell2} {seashell3} {seashell4} {sienna} {sienna1} {sienna2} {sienna3} {sienna4} {sky blue} {SkyBlue} {SkyBlue1} {SkyBlue2} {SkyBlue3} {SkyBlue4} {slate blue} {slate gray} {slate grey} {SlateBlue} {SlateBlue1} {SlateBlue2} {SlateBlue3} {SlateBlue4} {SlateGray} {SlateGray1} {SlateGray2} {SlateGray3} {SlateGray4} {SlateGrey} {snow} {snow1} {snow2} {snow3} {snow4} {spring green} {SpringGreen} {SpringGreen1} {SpringGreen2} {SpringGreen3} {SpringGreen4} {steel blue} {SteelBlue} {SteelBlue1} {SteelBlue2} {SteelBlue3} {SteelBlue4} {tan} {tan1} {tan2} {tan3} {tan4} {thistle} {thistle1} {thistle2} {thistle3} {thistle4} {tomato} {tomato1} {tomato2} {tomato3} {tomato4} {turquoise} {turquoise1} {turquoise2} {turquoise3} {turquoise4} {violet} {violet red} {VioletRed} {VioletRed1} {VioletRed2} {VioletRed3} {VioletRed4} {wheat} {wheat1} {wheat2} {wheat3} {wheat4} {white} {white smoke} {WhiteSmoke} {yellow} {yellow green} {yellow1} {yellow2} {yellow3} {yellow4} {YellowGreen}"
# set the location and name of the configuration file
set config_file "$home/.vpacman.config"
# various variables to hold the number of items found in the lists
set count_all 0
set count_installed 0
set count_outdated 0
set count_uninstalled 0
# array of balloon help variables
# bubble()
# the package name and dataview tab currently shown in the dataview window
set dataview ""
# the path to the pacman sync databases
set dbpath "/var/lib/pacman"
# set debug mode
# launch vpacman with no arguments to direct debug to stdout, use '-d' or --'debug' to direct debug to a file in the home directory, use -dd to increase the debug level
set debug_out(1) "stdout"
# throw away excess dubug messages
set debug_out(2) [open "/dev/null" w]
set debug_out(3) $debug_out(2)
# restart with the correct debug level
# if we started in debug mode
if {$debug != ""} {
# if we restarted then append the debug messages to the debug file
# otherwise start a new debug file
if {[string first "--restart" $args] != -1} {
# re-open the debug files
if {$debug == "high"} {
set debug_out(1) [open "$home/vpacman_debug.txt" a]
set debug_out(2) $debug_out(1)
set debug_out(3) $debug_out(1)
} elseif {$debug == "medium"} {
set debug_out(1) [open "$home/vpacman_debug.txt" a]
set debug_out(2) $debug_out(1)
} elseif {$debug == "low"} {
set debug_out(1) [open "$home/vpacman_debug.txt" a]
}
puts $debug_out(1) "Restart called with debug $debug"
} else {
# remove any existing debug file
file delete ${home}/vpacman_debug.txt
# and start a new one
if {$debug == "high"} {
set debug_out(1) [open "$home/vpacman_debug.txt" w]
set debug_out(2) $debug_out(1)
set debug_out(3) $debug_out(1)
} elseif {$debug == "medium"} {
set debug_out(1) [open "$home/vpacman_debug.txt" w]
set debug_out(2) $debug_out(1)
} elseif {$debug == "low"} {
set debug_out(1) [open "$home/vpacman_debug.txt" w]
}
}
}
if {$debug != ""} {
puts $debug_out(1) "Running vpacman with debug set to $debug and debug messages saved to $home/vpacman_debug.txt"
} else {
puts $debug_out(1) "Running vpacman with debug set to low and debug messages sent to stdout"
}
# a list of all the packages which have been searched for their dependencies
set depends_searches ""
# the programme to use to compare files
set diffprog ""
# the programme to use for downloads
set dlprog ""
# default editor
set editor ""
# the filter selected in the checkboxes
set filter "all"
# the list to use to filter
set filter_list ""
# the search string selected in the find field
set find ""
# the search string selected in the find file field
set findfile ""
# the search type selected in the find field
set findtype "find"
# this is the message for the number of items found
set find_message ""
# are we in the process of a full system upgrade
set fs_upgrade false
# set the options window to a fixed size
set geometry_config "487x256"
# the group selected in the combobox
set group "All"
# the index number of the selected group in the group list box
set group_index 0
# the help text
set help_text "
This simple programme allows you to View the packages available in those pacman repositories which have been enabled in the pacman configuration file (/etc/pacman.conf) and to Install, Upgrade and Delete those packages. It also includes packages which have been installed from other sources - either from AUR or locally.
The only dependencies are Pacman, TCL, TK, a terminal and Wmctrl. Pacman is always used to install, update, delete and synchronize the pacman packages and database. Therefore the entries in the pacman configuration file will always be respected.
Note: Wmctrl relies on the window title set for the terminal. In order to use konsole the profile must be set to use the window title set by the shell.
Optional dependencies are a browser, an editor, Pacman-contrib, Pkgfile, Xwininfo.
<strong>Usage:</strong>
The main window consists of a menu bar, a toolbar, a set of filter and list options, a window showing a list of packages, and a window, below that, which shows details of a selected package.
<strong>Menu Bar:</strong>
File: <lm3>Quit</lm3>
Edit: <lm3>Select All > Select all the packages displayed.</lm3>
<lm3>Clear All > De-select all the selected packages.</lm3>
Tools: <lm3>Full System Upgrade > The only supported method of updating outdated packages. It may be wise to check the latest news (View > Latest News) before performing a full system upgrade.</lm3>
<lm3>Install > Ask pacman to install or reinstall the selected packages. Partial upgrades are not supported. Note that AUR packages (local) can only be updated one at a time through AUR/Local Updates.</lm3>
<lm3>Delete > Ask pacman to delete the selected packages.</lm3>
<lm3>Sync > Ask pacman to synchronize the pacman database. The elapsed time since the last synchronization is shown at the foot of the filter and list options. If no recent synchronization has been made then the elapsed time shows the time since Vpacman was started.</lm3>
<lm3>Check Config Files > Display a list of any configuration file which need to be dealt with (see \"https://wiki.archlinux.org/index.php/Pacman/Pacnew_and_Pacsave\"). If a Compare Files programme has been set in Options, then offers to update any configuration files found.</lm3>
<lm3>Clean Package Cache > Delete any superfluous packages from the pacman cache to release disk space. The default is to keep at least the most recent three versions of each package. Cleaning can optionally be restricted to uninstalled packages. (Requires paccache)</lm3>
<lm3>Clean Pacman Log > Reduce the size of the pacman log by deleting old entries to release disk space. The default is to keep at least the most recent twelve monthss. Cleaning will always keep the entries for today. Optionally keep a backup copy of the old log file.</lm3>
<lm3>Install AUR/Local > Install an AUR package by name, or a local package file. Optionally browse for a local file to install. Use the \"Info\" button to search the list of AUR packages for packages that start with the package name and to view information about an AUR package. Use the \"Install\" button to install the package. Vpacman will attempt to recursively install any AUR dependencies, pacman will install any dependencies available from the repositories.</lm3>
<lm3>Make Backup Lists > Save backup lists of the various packages installed, and a copy of the pacman configuration file, to a chosen directory.</lm3>
<lm3>Update Cups > Run cups_genppdupdate if necessary and restart cups. Use if gutenprint has been updated.</lm3>
<lm3>Update Mirrorlist > Update the pacman mirrorlist optionally selecting servers for specific countries and excluding any servers where the current status is known to be \"Poor\" and/or \"Bad\".</lm3>
<lm3>Options > Change any of the configurable options for Vpacman. Allows for editing the configuration file manually, which could break Vpacman! In case of problems delete the configuration file \"~/.vpacman.config\" to return all the values to default.</lm3>
View: <lm3>Latest News > Read the last year of news from archlinux.org</lm3>
<lm3>Pacman Configuration > View the the pacman configuration file.</lm3>
<lm3>Recent Pacman Log > View the pacman log file.</lm3>
<lm3>Dependency Updates > View a report of the dependencies which will be updated in the next Full System Upgrade.</lm3>
<lm3>Hide Menubar > Hide the menu bar. Can be shown again using the right click menu in the Packages Window - see below.</lm3>
<lm3>Hide/Show Toolbar > Hide or show the tool bar</lm3>
Help: <lm3>Help > This help message.</lm3>
<lm3>About > Information about this programme.</lm3>
<strong>Tool Bar:</strong>
<lm2>Full System Update > The only supported method of updating outdated packages. It may be wise to check the latest news before performing a full system upgrade.</lm2>
<lm2>Sync > Ask pacman to synchronize the pacman database. The elapsed time since the last synchronization is shown at the foot of the filter and list options. If no recent synchronization has been made then the elapsed time shows the time since Vpacman was started.</lm2>
<lm2>Install > Ask pacman to install or update the selected packages. Note that AUR packages (local) can only be updated one at a time through AUR/Local Updates.</lm2>
<lm2>Delete > Ask pacman to delete the selected packages.</lm2>
<lm2>Find > Enter any string to search for in the list of packages displayed. The search will be carried out over all the fields of the packages listed, including the description but excluding the repository name. Click on the label \"Find\" to change to a search the package names only, click again to search for the packages providing a specified file. Enter the full name of the file to search for, and press return to start the search. On the first search during any day, if necessary, a prompt will ask if the file database should be updated. Click on the label again to return to the \"Find\" option.</lm2>
<lm2>Options > Change any of the configurable options for Vpacman. Allows for editing the configuration file manually, which could break Vpacman! In case of any problems delete the configuration file \"$ rm ~/.vpacman.config\" to return all the values to sane defaults.</lm2>
<strong>Filters:</strong>
<lm2>All > Check to show all the available packages including the installed AUR or local packages.</lm2>
<lm2>Group > Filter the selection to only show the packages included in the selected group.</lm2>
<lm2>To aid in navigating the list there is a scroll bar at the right edge of the drop down window. Since the groups list displayed is rather long a Right-Click on the scroll bar at any point will align the list to that point. Right-Click on the top arrow will display the top of the list, Right-Click on the bottom arrow will display the end of the list.</lm2>
<lm2>Installed > Check to show only those packages which have been installed. Includes installed AUR and local packages.</lm2>
<lm2>Not Installed > Check to show only those packages which have not been installed.</lm2>
<lm2>Updates Available > Check to show those packages where an update is available. Use Full System Upgrade as the preferred update method.</lm2>
<lm2>Tip: If the filter shows unexpected results make sure that you have Groups set to \"All\" and that the Find entry is clear.</lm2>
<strong>List:</strong>
<lm2>Orphans > Check to ask pacman to list any packages which are no longer required as a dependency of another package.</lm2>
<lm2>Not Required > Check to ask pacman to list any packages not required by any other package.</lm2>
<lm2>AUR/Local Updates > Check to list any AUR packages which may need updating. This relies heavily on correct package version data in the AUR database, so may not be wholly accurate.</lm2>
<lm3>include all packages > Check to include all local packages in the AUR/Local Updates list.</lm3>
<strong>Packages Window:</strong>
<lm2>Shows the result of the Filter or List selection. The results will also respect any Group selected and any Find entry.</lm2>
<lm2>Tip: If the filter shows unexpected results make sure that you have Groups set to \"All\" and that the Find entry is clear.</lm2>
<lm2>Left-Click on any line to select that line. Left-Click a second time to de-select the line. Shift-click to select a range of lines, Control-click to add to a selection. Note that AUR/Local Updates packages may only be selected one at a time.</lm2>
<lm2>Right-Click to bring up a menu similar to the tools menu above. If there is a single package selected then an option will be available to Mark that package as Explicitly Installed, As a Dependancy or Ignored (or not). If the menu bar has been hidden then the last item on the list will offer to show the menu bar again.</lm2>
<lm2>Left-Click on a heading to sort the package list by that heading. Left-Click a second time to sort the list in reverse order.</lm2>
<lm2>To aid in navigating the list there is a scroll bar at the right edge of the window. Since some of the lists displayed can be rather long a Right-Click on the scroll bar at any point will align the list to that point. Right-Click on the top arrow will display the top of the list, Right-Click on the bottom arrow will display the end of the list.</lm2>
<strong>Details Window:</strong>
<lm2>Shows the requested information, according to the tab activated, about the latest package selected in the Packages Window.</lm2>
<lm2>Retrieval of some information may be slow, in which case a \"Searching\" message will be shown.</lm2>
<lm2>If an error is returned then an appropriate message may be displayed.</lm2>"
# do we have an internet connection
set is_connected true
# list of known browsers
set known_browsers [list chromium dillo epiphany falkon firefox opera qupzilla]
# list of know compare programmes
set known_diffprogs "diffuse kompare kdiff3 meld vimdiff"
# list of known_editors
set known_editors [list emacs nano vi vim]
# list of known terminals
set known_terminals [list {gnome-terminal} {--title <title> -- <command>} {konsole} {--title <title> -e <command>} {lxterminal} {--title <title> -e <command>} {mate-terminal} {--title <title> -e <command>} {qterminal} {--title <title> --execute <command>} {roxterm} {--title <title> -e <command>} {vte} {--name <title> --command <command>} {xfce4-terminal} {--title <title> -e <command>} {xterm} {-title <title> -e <command>}]
# the list of all the packages in the database, including locally installed packages in the form
# Repo Package Version Available Group(s) Description
set list_all ""
# the list of all the groups in the database in the form
# Group
set list_groups ""
# the list of all the installed packages, excluding locally installed packages in the form
# Repo Package Version Available Group(s) Description
set list_installed ""
# the list of locally installed packages in the form
# Repo(local) Package Version Available('-na-' while no known version available) Group('none') Description
set list_local ""
# the list of local packages with their list_all index and their list_show ids in the form
# name, list_all id, list_show index, treeview id
set list_local_ids ""
# the list ofpackages which can be updated
set list_outdated ""
# the list of repositories which have been included in the last sync
set list_repos ""
# the list of the packages on show in the treeview .wp.wfone.listview in the form
# Repo Package Version Available Group(s) Description
set list_show ""
# the same list but in the form
#id
set list_show_ids ""
# the order that the list_show is sorted into
set list_show_order "Package increasing"
# the list of packages which have not been installed in the form
# Repo Package Version Available Group(s) Description
set list_uninstalled ""
# the first item selected - used for the alternative treeview bindings
set listfirst ""
# the last item selected - used for the alternative treeview bindings
set listlast ""
# the last packages selected in listview, used to avoid continuously running the treeview selected binding, in the form
# id
set listview_last_selected ""
# the packages selected in listview, used to show the dataview information requested, in the form
# id
set listview_current ""
# the list of all the currently selected items in listview in the form
# id
set listview_selected ""
# the list of all the currently selected items in listview, in the order selected, in the form
# id
set listview_selected_in_order ""
# the number of newer AUR/Local packages identified to be upgraded
set local_newer 0
# an index
set index 0
# message to be shown in the button bar near the top of the window
set message ""
# a comma separated list of countries to use to compile a mirrorlist
set mirror_countries ""
# show message one_time
set one_time "true"
# list of updated packages which may require further actions
set package_actions [list "linux" "Linux was updated, consider rebooting" "gutenprint" "Gutenprint was installed or updated, consider running Tools > Update cups" ".pacnew" "A .pacnew file was installed, run Tools > Check Config Files to view and deal with the files" ".pacsave" "A .pacsave file was saved, run Tools > Check Config Files to view and deal with the files "]
# is it ok to skip a pacman files database upgrade - 0 no, 1 skip database upgrade, 2 skip database install.
set pacman_files_upgrade 0
# is it ok to skip a ppkgfile database upgrade - 0 no, 1 skip database upgrade, 2 skip database install.
set pkgfile_upgrade 0
# is it ok to run a partial upgrade- 0 no, 1 yes.
set part_upgrade 0
# have we agreed to select all the packages
set repo_delete_msg true
# show a warning message if we have selected a mix of local and repository packages and therefore can only delete the repo packages
set select false
# variable to select one of the list options in the Filter frame
set selected_list 0
# this is the message for the number of items selected
set selected_message ""
# show the menu bar yes or no
set show_menu "yes"
# show the toolbar yes or no
set show_buttonbar "yes"
# set start_time
set start_time [clock milliseconds]
# the state of any package(s) selected: install, delete or blank(none)
set state ""
# set the default su command
set su_cmd "su -c"
# the time of the last sync in clock seconds
set sync_time 0
# the system data (sync)
set system ""
# the result of the last test system
set system_test "stable"
# default terminal
set terminal ""
# is there a conflicting thread running
set thread ""
# threads: is tcl threaded, true or false
# a list of times returned by get_sync_times - sync_time and update_time
set times ""
# the first treeview item id displayed
set tv_index ""
# the result from the treeview selection binding
set tv_select ""
# the treeview message to display of any errors have been found
set tverr_message ""
# A list of any potential errors found in the treeview selection in the format Index Message
set tverr_text ""
# the time of the last full system update
set update_time ""
# a list of any packages selected which are set to upgrade
set upgrades ""
# the number of packages selected which are set to upgrade
set upgrades_count 0
# Various geometry settings for windows
set win_configx 0
set win_configy 0
set win_mainx 0
set win_mainy 0
# ELEVATED PRIVILEGES
# Check if we have been run as root or with root privileges
if {[exec id -u] eq 0 } {
set su_cmd ""
# if not root then do we have sudo privileges without a password
} else {
# remove any saved credentials
exec sudo -k
# and test if a passsword is required
set error [catch {exec sudo -n true}]
if {$error == 0} {
set su_cmd "sudo -n"
# the -n option is only needed to distinguish the su_cmd from the next one!
} else {
# or perhaps we can use sudo but still need a password
# sudo -v will either ask for a password or return
# immediately with a "may not run sudo" message.
# so try it
# if vpacman was run from a terminal the password request will still be on the screen!
# so remove the prompt with -p ""
set error [catch {exec sudo -S -v -p "" < /dev/null} error_message]
# what was the result?
# if the result includes the user name then it will be a "Sorry ..." result
# otherwise it will include sudo: as in "sudo: no password...."
# both will be error 1
if {[string first "$env(USER)" $error_message] == -1} {set su_cmd "sudo"}
# otherwise just use the default
}
}
puts $debug_out(1) "Test complete - su command is $su_cmd ([expr [clock milliseconds] - $start_time])"
# only certain commands will need elevated privileges. Since we are running all commands in a terminal session
# we can ask for a password in that session if necessary
# so there really is no need to use a graphical su command.
puts $debug_out(1) "Version $version: User is $env(USER) - Home is $home - Config file is $config_file - Programme Directory is $program_dir - Su command is set to $su_cmd"
# PROCEDURES
# proc all_clear
# Clear all of the items shown in the treeview widget
# proc all_select
# Select all of the items shown in the treeview widget
# proc aur_install
# Install an AUR/Local package
# proc aur_install_depends
# Install each for the aur dependencies listed
# proc aur_upgrade
# Upgrade a given AUR package
## The following procedures create help messages invoked when the cursor hovers over a widget.
# proc balloon {target message {cx 0} {cy 0} }
# proc balloon_set {target message}
# proc balloon_unset
##
# proc check_config_files
# Check for any existing configurations files that have not been dealt with
# proc check_repo_files
# Check that the database files exist for each repository in the pacman configuration file and return the list of repositories
# proc clean_cache
# Clean unnecessary files from the pacman cache
# proc cleanup_checkbuttons {aur}
# After a filter checkbutton is selected return the necessary variables to sane settings,
# set aur_only to the value requested. Reset the list checkbutton titles.
# proc clock_format
# format a time according to the format requested
# proc configurable
# Set configurable variables to sane values
# proc configurable_default
# Initialize a configurable variable to the first item in the known variables list which is installed
# proc configure
# Display a new window to allow the configurable variables to be changed.
# Also allows the configuration file to be edited using the selected editor.
# proc count_lists
# Count the number of items in the lists found by the list_ procedures, inlcude list_licalcount in list_installed
# proc execute {type}
# Execute a command in the specified terminal depending on the type of action passed to the procedure (Install, Remove or Sync)
# proc execute_command {action command wait}
# Execute a command depending on the action required, and wait for a response if requested
# proc execute_terminal_isclosed
# Wait for the terminal to close
# proc execute_terminal_isopen
# Wait for a terminal to open
# proc filter
# Select the required programmes depending on the active filter checkbutton, the selected group and the search (find) entry
# proc filter_checkbutton {button command title}
# Procedure to run after a list checkbutton has been activated. Set the required parameters dependant on the button
# and call list_special with the command specified. Finally reset the list checkbutton title to the specified title.
# proc find {find list type}
# Find all the items in the displayed list which contain the find string. For type all - Search all the fields,
# including those not displayed, except for the Repo field, for type name - search the name field only.
# proc find_pacman_config
# Find pacman configuration data
# proc get_aur_dependencies {package}
# Find the dependencies required for a specified AUR package
# proc get_aur_info {package}
# Get various information about a named package. Returns the description, version, URL, the date last updated, the dependencies:
# depends, checkdepends, makedepends, optdepends and any keywords.
# proc get_aur_list
# Get a list of the names of the available aur packages
# proc get_aur_matches
# Find any matches for a name n the aur list
# proc get_aur_name
# Get the package name required from a list of matches
# proc get_aur_updates
# Find local files which may need to be updated or may not be found amongst the AUR packages
# proc get_aur_versions
# Procedure to find the current available aur version and description for all the list_local packages.
# proc get_configs
# Read the configuration variables from the configuration file (
# proc get_dataview {current}
# Get the information required, depending on the active tab in the dataview notebook. Since some of the details
# can take a while to retrieve, show a searching message where necessary.
# proc get_file_mtime
# Get the last modified time for a set of files
# proc get_mirrorlist
# Get the latest mirrorlist
# proc get_password
# Get a password whenever needed.
# proc get_sync_time
# Get the last sync time, the list of repositories and check that the temporary database is up to date.
# proc get_system_data
# Get the system data (sync)
# proc get_terminal
# If no terminal is configured or found in the known_terminals list, try to get a valid terminal and terminal_string
# proc get_terminal_string {terminal}
# get the terminal_string for a given terminal from the known_terminals list
# proc get_win_geometry
# Get the geometry of the windows
# proc grid_remove_listgroups
# Remove the listgroups widget
# proc grid_set_listgroups
# Show the listgroups widget
## All list are in the format: Repo Package Version Available Group(s) Description
# proc list_all
# Make a list of all the available programmes in the database
# proc list_local
# Make a list of the locally installed programmes including AUR programmes
# proc list_groups
# Make a list of all the available groups
# proc list_special {execute_string}
# Make a list based on a specific comamnd, the execute string. Run the command a create the list.
# proc list_show {list}
# Display the list, passed to the procedure, in the treeview widget.
# proc make_backup_lists
# Make list of all the installed pacakges suitable for restoring after a reinstall
# proc mirrorlist_countries
# Select the required countries from a list of countries included in the mirrorlist
# proc mirrorlist_filter
# Filter and rank the given mirrorlist file, .pacnew or .backup, by the selected countries, the status of the mirrors and/or the number of servers required.
# proc mirrorlist_update
# Offer to update the mirrorlist, .pacnew if it exists otherwise .backup, by the selecting countries, the mirror status and/or the number of servers required.
# proc place_warning_icon
# Place a warning icon in the .filetr_icons frame
# proc put_aur_files
# called by thread aur_files to get the file lists for AUR/Local files for a file name search
# proc put_aur_versions
# called by thread aur_versions to get the available versions and descriptions of AUR/Local files and update the lists and treeview
# proc put_configs
# Write the configuration variables to the configuration file
# proc put_list_groups
# called by thread list_groups to get the list of groups available
# proc read_about
# Display the about text
# proc read_aur_info
# Read the information from downloaded AUR package details
# proc read_config
# Read the pacman configuration file and display it.
# proc read_dependencies (params)
# Check package upgrades available for changes in dependencies, and make a report if requested
# proc read_dependencies_extra
# Check for any extra packages required by added dependencies on an upgrade
# proc read_dependencies_provides
# Check for any dependencies that are provided by another package and which are required by added dependencies on an upgrade
# proc read_help
# Display the help text
# proc read_log
# Find the pacman log file and display it.
# proc read_news
# Try to downlaod and parse the arch news rss, and display it. If not possible then browse to the web page
# proc remove_warning_icon
# Remove a warning icon and reposition any remaining icons
# proc set_clock
# Calculate the elapsed time since the last significant event, the e-time, which is set at the start of the programme,
# or the last sync event. Displays and updates the elapsed time at the foot of the window.
# proc set_images
# Set up the images for use in the toolbar and other widgets
# proc set_message {type text}
# Displays a message in the message area at the top of the window. The type influences whether the message
# is appended to, resets or replaces a previous message
# proc set_wmdel_protocol {type}
# Set the main window exit code, depending on the type, exit or noexit, requested
# proc sort_list
# Show the displayed list in the current order
# proc sort_list_toggle {heading}
# Toggle the order of whatever is shown in the treeview widget, in descending or ascending order, when a heading is clicked.
# proc start
# On start up, or after a terminal command has been run to update all the base lists, all, installed, not installed and available updates.
# proc system_upgrade
# Execute a full system upgrade
# proc test_aur_matches
# Test a name against any matches found for various conditions
# proc test_configs
# Test the current configuration options are sane, if not, reset to a default setting as necessary.
# proc test_files_data
# Test the requested files databases exist and are up to date
# proc test_internet
# Test, up to three times for an internet connection.
# proc test_resync
# Test if a resync is required after a failed update or an external intervention
# proc test_system
# called by thread test system to see if it appears to be in an unstable condition.
# proc test_versions {installed available}
# test if the available version is newer or older than the installed version
# proc toggle_buttonbar
# Toggle the menu entry to show or hide the buttonbar
# proc toggle_ignored
# Toggle an installed package as ignored/not ignored
# proc trim_log
# clean the pacman log keeping the last keep_log months and, optionally, a backup of the current log
# proc update_config_files {filelist} {
# tools to update any config files found
# proc update_cups
# if gutenprint is installed run cups-genppdupdate to update ppds - restart cups
# proc update_db
# copies the pacman sync database into the temporary directory
# proc view_text
# open a window and display some text in it
# proc view_text_codes
# read through some text and replace a set of codes with a given tag
# proc view_text_url
# check for a selection before opening a URL in the browser
proc all_select {} {
global debug_out list_show list_show_ids select tv_select
# select all the items in listview
puts $debug_out(1) "all_select called"
if {[llength $list_show_ids] > 500 && $select == false} {
set ans [tk_messageBox -default cancel -detail "" -icon warning -message "\nReally select [llength $list_show_ids] packages?" -parent . -title "Warning" -type okcancel]
switch $ans {
ok {set select true}
cancel {
set select false
return 1
}
}
}
if {[llength $list_show] == 1 && [llength [.wp.wfone.listview selection]] == 1} {
# one item is in the list and it is already selected
puts $debug_out(2) "all_select - one item is already selected"
} else {
set tv_select ""
puts $debug_out(2) "all_select - set selection to $list_show_ids"
.wp.wfone.listview selection add $list_show_ids
# bind TreeviewSelect will update all the variables when the selection changes
vwait tv_select
}
puts $debug_out(1) "all_select completed"
return 0
}
proc all_clear {} {
global debug_out listview_selected part_upgrade select tv_select
# clear all the items selected in listview
puts $debug_out(1) "all_clear called"
set select false
set tv_select ""
puts $debug_out(2) "all_clear - remove any treeview selection"
catch {.wp.wfone.listview selection remove $listview_selected}
# bind TreeviewSelect will update all the variables when the selection changes
vwait tv_select
puts $debug_out(2) "all_clear - treeview select completed"
set part_upgrade 0
puts $debug_out(1) "all_clear completed - partial upgrades set to no"
return 0
}
proc aur_install {} {
global debug_out depends_searches home list_local win_mainx win_mainy
# open a window to ask for a AUR package name to install or browse for a local package
# if there are no other aur dependencies required, either to run, make or check, then install it
# otherwise pass control to aur_install_depends
puts $debug_out(1) "aur_install called"
set depends_searches ""
toplevel .aurinstall
get_win_geometry
set left [expr $win_mainx + {[winfo width .] / 2} - {360 / 2}]
set down [expr $win_mainy + {[winfo height .] / 2} - {170 / 2}]
wm geometry .aurinstall 360x175+$left+$down
wm iconphoto .aurinstall tools
wm protocol .aurinstall WM_DELETE_WINDOW {
# assume cancel aur install, see button .aurinstall.cancel
.aurinstall.cancel invoke
}
wm resizable .aurinstall 0 0
wm title .aurinstall "Install AUR/Local Package"
wm transient .aurinstall .
# CONFIGURE AUR INSTALL WINDOW
label .aurinstall.packagename_label \
-text "AUR Package Name"
entry .aurinstall.packagename \
-borderwidth 0 \
-validate key \
-validatecommand {
if {"%S" == " "} {
return 0
}
.aurinstall.package configure -text %P
if {"%P" == "{}"} {
.aurinstall.info configure -state disabled
} else {
.aurinstall.info configure -state normal
}
return 1
}
bind .aurinstall.packagename <Return> {.aurinstall.install invoke}
label .aurinstall.filename
.aurinstall.filename configure -text ""
label .aurinstall.package
.aurinstall.package configure -text ""
button .aurinstall.info \
-command {
if {[.aurinstall.package cget -text] != ""} {
set package [.aurinstall.package cget -text]
# try to download an up-to-date packages list
# the packages list is updated frequently so always get a new file if possible
set result [get_aur_list]
if {$result == 1} {
puts $debug_out(2) "aur_install - cannot download new package list and there is no existing package available"
set ans [tk_messageBox -default ok -detail "Could not download the AUR package list.\nNo previous AUR package list is available.\nCannot continue" -icon error -message "Failed to download AUR package list" -parent .aurinstall -title "Error" -type ok]
} elseif {$result == 2} {
puts $debug_out(2) "aur_install - cannot download new package list and do not use the package list available"
} else {
# now find matches in the list
set matches [get_aur_matches $package]
set result [test_aur_matches $package $matches]
# now get the required package name from the list of matches found
set aur_name [get_aur_name $package $matches]
tkwait window .aurinstall.aurname
puts $debug_out(2) "aur_install - returned aur_name: $aur_name"
if {$aur_name == 3} {
puts $debug_out(2) "aur_install - aur_name was cancelled"
focus .aurinstall.packagename
} else {
.aurinstall.package configure -text $aur_name
.aurinstall.filename configure -text ""
.aurinstall.packagename delete 0 end
.aurinstall.packagename insert 0 $aur_name
.aurinstall.packagename icursor end
focus .aurinstall.packagename
}
# now reset the grab on .aurinstall
grab set .aurinstall
}
}
} \
-state disabled \
-text "Info"
label .aurinstall.browse_label \
-text "or browse to a file to install"
button .aurinstall.browse \
-command {
# the next code will call tk_getOpenFile
catch {tk_getOpenFile no file}
# and arrange to hide the hidden files
set ::tk::dialog::file::showHiddenVar 0
# and display a button to show hidden files
set ::tk::dialog::file::showHiddenBtn 1
# now choose to display only the package files
set types {
{{Packages} {.pkg.tar.xz .pkg.tar.zst} }
}
# and set a title for the window
set title "Vpacman : Browse"
# try to enlarge the window immediately after it opens
after 100 {exec wmctrl -r $title -e 0,-1,-1,600,350}
# now browse for a file
set filename [tk_getOpenFile -filetypes $types -title $title]
.aurinstall.filename configure -text $filename
if {$filename != ""} {
.aurinstall.package configure -text ""
.aurinstall.packagename delete 0 end
.aurinstall.packagename insert 0 [string range [file tail $filename] 0 [string first ".pkg." [file tail $filename]]-1]
.aurinstall.info configure -state disabled
}
} \
-text "Browse" \
-width 8
frame .aurinstall.buttons
button .aurinstall.install \
-command {
if {[.aurinstall.filename cget -text] != ""} {
set filename [.aurinstall.filename cget -text]
puts $debug_out(1) "aur_install - install file \"$filename\""
grab release .aurinstall
destroy .aurinstall
puts $debug_out(2) "aur_install - call aur_upgrade with file \"$filename\" and type \"install\""
aur_upgrade $filename "install"
} elseif {[.aurinstall.package cget -text] != ""} {
# try to download an up-to-date packages list
# the packages list is updated frequently so always get a new file if possible
set result [get_aur_list]
if {$result == 1} {
puts $debug_out(2) "aur_install - cannot download new package list and there is no existing package available"
set ans [tk_messageBox -default ok -detail "Could not download the AUR package list.\nNo previous AUR package list is available.\nCannot continue" -icon error -message "Failed to download AUR package list" -parent .aurinstall -title "Error" -type ok]
} elseif {$result == 2} {
puts $debug_out(2) "aur_install - cannot download new package list and do not use the package list available"
} else {
set package [.aurinstall.package cget -text]
puts $debug_out(1) "aur_install - install package $package"
# first get the dependencies for the named package
puts $debug_out(2) "aur_install - call get_aur_dependencies for $package"
set depends [get_aur_dependencies $package]
if {$depends != "cancel"} {
if {$depends == "none"} {
puts $debug_out(2) "aur_install - get_aur_dependencies has already been called for $package"
set aur_installs ""
} else {
# the following dependencies are required by $package
puts $debug_out(2) "aur_install - get_aur_dependencies found:"
puts $debug_out(2) "\tRequired: [lindex $depends 0]"
puts $debug_out(2) "\tRepo installs needed: [lindex $depends 1]"
puts $debug_out(2) "\tAUR installs needed: [lindex $depends 2]"
puts $debug_out(2) "\tCheck Required: [lindex $depends 3]"
puts $debug_out(2) "\tCheck Repo installs needed: [lindex $depends 4]"
puts $debug_out(2) "\tCheck AUR installs needed: [lindex $depends 5]"