| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | // Copyright © 2020 Ettore Di Giacinto <mudler@mocaccino.org> | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // 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 2 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 <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | package cmd | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2022-01-06 23:57:56 +01:00
										 |  |  | 	"github.com/mudler/luet/pkg/api/core/types" | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 	installer "github.com/mudler/luet/pkg/installer" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	helpers "github.com/mudler/luet/cmd/helpers" | 
					
						
							| 
									
										
										
										
											2021-08-03 16:48:29 +02:00
										 |  |  | 	"github.com/mudler/luet/cmd/util" | 
					
						
							| 
									
										
										
										
											2021-10-21 00:13:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 	"github.com/spf13/cobra" | 
					
						
							| 
									
										
										
										
											2021-10-19 22:26:23 +02:00
										 |  |  | 	"github.com/spf13/viper" | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var replaceCmd = &cobra.Command{ | 
					
						
							|  |  |  | 	Use:     "replace <pkg1> <pkg2> --for <pkg3> --for <pkg4> ...", | 
					
						
							|  |  |  | 	Short:   "replace a set of packages", | 
					
						
							|  |  |  | 	Aliases: []string{"r"}, | 
					
						
							|  |  |  | 	Long: `Replaces one or a group of packages without asking questions: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$ luet replace -y system/busybox ... --for shells/bash --for system/coreutils ... | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 	PreRun: func(cmd *cobra.Command, args []string) { | 
					
						
							| 
									
										
										
										
											2021-10-19 22:26:23 +02:00
										 |  |  | 		viper.BindPFlag("onlydeps", cmd.Flags().Lookup("onlydeps")) | 
					
						
							|  |  |  | 		viper.BindPFlag("nodeps", cmd.Flags().Lookup("nodeps")) | 
					
						
							|  |  |  | 		viper.BindPFlag("force", cmd.Flags().Lookup("force")) | 
					
						
							|  |  |  | 		viper.BindPFlag("for", cmd.Flags().Lookup("for")) | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-19 22:26:23 +02:00
										 |  |  | 		viper.BindPFlag("yes", cmd.Flags().Lookup("yes")) | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 	Run: func(cmd *cobra.Command, args []string) { | 
					
						
							| 
									
										
										
										
											2022-01-06 23:57:56 +01:00
										 |  |  | 		var toUninstall types.Packages | 
					
						
							|  |  |  | 		var toAdd types.Packages | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-19 22:26:23 +02:00
										 |  |  | 		f := viper.GetStringSlice("for") | 
					
						
							|  |  |  | 		force := viper.GetBool("force") | 
					
						
							|  |  |  | 		nodeps := viper.GetBool("nodeps") | 
					
						
							|  |  |  | 		onlydeps := viper.GetBool("onlydeps") | 
					
						
							|  |  |  | 		yes := viper.GetBool("yes") | 
					
						
							| 
									
										
										
										
											2021-03-07 11:39:19 +01:00
										 |  |  | 		downloadOnly, _ := cmd.Flags().GetBool("download-only") | 
					
						
							| 
									
										
										
										
											2021-03-06 10:21:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 		for _, a := range args { | 
					
						
							|  |  |  | 			pack, err := helpers.ParsePackageStr(a) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							| 
									
										
										
										
											2021-10-21 00:13:02 +02:00
										 |  |  | 				util.DefaultContext.Fatal("Invalid package string ", a, ": ", err.Error()) | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			toUninstall = append(toUninstall, pack) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for _, a := range f { | 
					
						
							|  |  |  | 			pack, err := helpers.ParsePackageStr(a) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							| 
									
										
										
										
											2021-10-21 00:13:02 +02:00
										 |  |  | 				util.DefaultContext.Fatal("Invalid package string ", a, ": ", err.Error()) | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			toAdd = append(toAdd, pack) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 23:57:56 +01:00
										 |  |  | 		util.DefaultContext.Config.Solver.Implementation = types.SolverSingleCoreSimple | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-17 15:21:03 +01:00
										 |  |  | 		util.DefaultContext.Debug("Solver", util.DefaultContext.Config.Solver.CompactString()) | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		inst := installer.NewLuetInstaller(installer.LuetInstallerOptions{ | 
					
						
							| 
									
										
										
										
											2021-12-17 15:21:03 +01:00
										 |  |  | 			Concurrency:                 util.DefaultContext.Config.General.Concurrency, | 
					
						
							|  |  |  | 			SolverOptions:               util.DefaultContext.Config.Solver, | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 			NoDeps:                      nodeps, | 
					
						
							|  |  |  | 			Force:                       force, | 
					
						
							|  |  |  | 			OnlyDeps:                    onlydeps, | 
					
						
							|  |  |  | 			PreserveSystemEssentialData: true, | 
					
						
							|  |  |  | 			Ask:                         !yes, | 
					
						
							| 
									
										
										
										
											2021-03-07 11:39:19 +01:00
										 |  |  | 			DownloadOnly:                downloadOnly, | 
					
						
							| 
									
										
										
										
											2021-10-21 00:13:02 +02:00
										 |  |  | 			PackageRepositories:         util.DefaultContext.Config.SystemRepositories, | 
					
						
							|  |  |  | 			Context:                     util.DefaultContext, | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 23:57:56 +01:00
										 |  |  | 		system := &installer.System{Database: util.SystemDB(util.DefaultContext.Config), Target: util.DefaultContext.Config.System.Rootfs} | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 		err := inst.Swap(toUninstall, toAdd, system) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2021-10-21 00:13:02 +02:00
										 |  |  | 			util.DefaultContext.Fatal("Error: " + err.Error()) | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func init() { | 
					
						
							| 
									
										
										
										
											2021-03-06 10:21:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 	replaceCmd.Flags().Bool("nodeps", false, "Don't consider package dependencies (harmful!)") | 
					
						
							|  |  |  | 	replaceCmd.Flags().Bool("onlydeps", false, "Consider **only** package dependencies") | 
					
						
							|  |  |  | 	replaceCmd.Flags().Bool("force", false, "Skip errors and keep going (potentially harmful)") | 
					
						
							|  |  |  | 	replaceCmd.Flags().BoolP("yes", "y", false, "Don't ask questions") | 
					
						
							|  |  |  | 	replaceCmd.Flags().StringSlice("for", []string{}, "Packages that has to be installed in place of others") | 
					
						
							| 
									
										
										
										
											2021-03-07 11:39:19 +01:00
										 |  |  | 	replaceCmd.Flags().Bool("download-only", false, "Download only") | 
					
						
							| 
									
										
										
										
											2020-12-02 18:24:32 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	RootCmd.AddCommand(replaceCmd) | 
					
						
							|  |  |  | } |