eee5c202161e370e0b7596e193d992e61f8a0cfa
[dragonfly.git] / contrib / bsdinstaller-1.1.6 / src / backend / lua / configure / menu / 550_remove_packages.lua
1 -- $Id: 550_remove_packages.lua,v 1.7 2005/04/04 20:38:50 cpressey Exp $
2
3 require "cmdchain"
4 require "package"
5 require "storage_ui"
6
7 local num_keys = function(tab)
8         local k, v
9         local i = 0
10         for k, v in tab do i = i + 1 end
11         return i
12 end
13
14 local remove_packages = function()
15         local base = App.state.target:get_base()
16         local pkg_list = Package.list_all(base)
17         local ok, i, pkg_name, selected
18         local sel_pkgs = {}
19
20         if table.getn(pkg_list) == 0 then
21                 App.ui:inform(_(
22                     "There are no packages installed on this system."
23                 ))
24                 return
25         end
26
27         for i, pkg_name in pkg_list do
28                 sel_pkgs[pkg_name] = false -- but present...
29         end
30
31         ok, sel_pkgs = StorageUI.select_packages{
32             name = _("Select Packages"),
33             short_desc = _("Select the packages you wish to remove from " ..
34                             "this system"),
35             checkbox_name = _("Remove?"),
36             ok_name = _("Remove these Packages"),
37             cancel_name = _("Cancel"),
38
39             sel_pkgs = sel_pkgs
40         }
41
42         if ok then
43                 local cmds = CmdChain.new()
44                 local pkg_seen = {}
45                 local pkg_done = {}
46                 local pkg_extra = ""
47                 local n, i = 0, 0
48                 local pr = App.ui:new_progress_bar{
49                     title = _("Calculating package dependencies...")
50                 }
51
52                 for pkg_name, selected in sel_pkgs do
53                         if selected then
54                                 n = n + 1
55                         end
56                 end
57
58                 pr:start()
59                 for pkg_name, selected in sel_pkgs do
60                         if selected then
61                                 Package.cmds_remove(
62                                     base, cmds, pkg_name, pkg_seen, pkg_done
63                                 )
64                                 i = i + 1
65                                 pr:set_amount((i * 100) / n)
66                                 pr:update()
67                         end
68                 end
69                 pr:stop()
70
71                 for pkg_name, selected in pkg_seen do
72                         if not sel_pkgs[pkg_name] then
73                                 pkg_extra = pkg_extra .. pkg_name .. "\n"
74                         end
75                 end
76
77                 if pkg_extra ~= "" then
78                         if not App.ui:confirm(_(
79                                 "The following installed packages require " ..
80                                 "one or more of the packages you selected, " ..
81                                 "and will also be removed:\n\n%s\n" ..
82                                 "Is this acceptable?", pkg_extra
83                             )) then
84                                 return
85                         end
86                 end
87
88                 if cmds:execute() then
89                         App.ui:inform(_(
90                             "%d/%d packages were successfully removed!",
91                             num_keys(pkg_done), num_keys(pkg_seen)
92                         ))
93                 else
94                         App.ui:inform(_(
95                             "There were errors. " ..
96                             "Some packages may not have been " ..
97                             "successfully removed."
98                         ))
99                 end
100         end
101 end
102
103 return {
104     name = _("Remove Packages"),
105     effect = function()
106         remove_packages()
107         return Menu.CONTINUE
108     end
109 }