2019-11-24 17:28:39 +00:00
// Copyright © 2019 Ettore Di Giacinto <mudler@gentoo.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 (
"os"
"path/filepath"
"regexp"
installer "github.com/mudler/luet/pkg/installer"
2019-12-29 15:33:10 +00:00
. "github.com/mudler/luet/pkg/config"
2019-11-24 17:28:39 +00:00
. "github.com/mudler/luet/pkg/logger"
pkg "github.com/mudler/luet/pkg/package"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var installCmd = & cobra . Command {
Use : "install <pkg1> <pkg2> ..." ,
Short : "Install a package" ,
2019-11-25 18:55:30 +00:00
PreRun : func ( cmd * cobra . Command , args [ ] string ) {
viper . BindPFlag ( "system-dbpath" , cmd . Flags ( ) . Lookup ( "system-dbpath" ) )
viper . BindPFlag ( "system-target" , cmd . Flags ( ) . Lookup ( "system-target" ) )
} ,
Long : ` Install packages in parallel ` ,
2019-11-24 17:28:39 +00:00
Run : func ( cmd * cobra . Command , args [ ] string ) {
2019-11-25 18:55:30 +00:00
c := [ ] * installer . LuetRepository { }
2019-11-24 17:28:39 +00:00
err := viper . UnmarshalKey ( "system-repositories" , & c )
if err != nil {
Fatal ( "Error: " + err . Error ( ) )
}
2019-11-25 18:55:30 +00:00
2019-11-24 17:28:39 +00:00
var toInstall [ ] pkg . Package
for _ , a := range args {
decodepackage , err := regexp . Compile ( ` ^([<>]?\~?=?)((([^\/]+)\/)?(?U)(\S+))(-(\d+(\.\d+)*[a-z]?(_(alpha|beta|pre|rc|p)\d*)*(-r\d+)?))?$ ` )
if err != nil {
Fatal ( "Error: " + err . Error ( ) )
}
packageInfo := decodepackage . FindAllStringSubmatch ( a , - 1 )
category := packageInfo [ 0 ] [ 4 ]
name := packageInfo [ 0 ] [ 5 ]
2019-12-14 23:19:48 +00:00
version := packageInfo [ 0 ] [ 1 ] + packageInfo [ 0 ] [ 7 ]
2019-11-24 17:28:39 +00:00
toInstall = append ( toInstall , & pkg . DefaultPackage { Name : name , Category : category , Version : version } )
}
2019-11-25 18:55:30 +00:00
// This shouldn't be necessary, but we need to unmarshal the repositories to a concrete struct, thus we need to port them back to the Repositories type
synced := installer . Repositories { }
for _ , toSync := range c {
s , err := toSync . Sync ( )
if err != nil {
Fatal ( "Error: " + err . Error ( ) )
}
synced = append ( synced , s )
}
2019-12-29 15:33:10 +00:00
inst := installer . NewLuetInstaller ( LuetCfg . GetGeneral ( ) . Concurrency )
2019-11-24 17:28:39 +00:00
2019-11-25 18:55:30 +00:00
inst . Repositories ( synced )
2019-11-24 17:28:39 +00:00
2019-11-25 18:55:30 +00:00
os . MkdirAll ( viper . GetString ( "system-dbpath" ) , os . ModePerm )
systemDB := pkg . NewBoltDatabase ( filepath . Join ( viper . GetString ( "system-dbpath" ) , "luet.db" ) )
2019-11-24 17:28:39 +00:00
system := & installer . System { Database : systemDB , Target : viper . GetString ( "system-target" ) }
err = inst . Install ( toInstall , system )
if err != nil {
Fatal ( "Error: " + err . Error ( ) )
}
} ,
}
func init ( ) {
path , err := os . Getwd ( )
if err != nil {
Fatal ( err )
}
installCmd . Flags ( ) . String ( "system-dbpath" , path , "System db path" )
installCmd . Flags ( ) . String ( "system-target" , path , "System rootpath" )
RootCmd . AddCommand ( installCmd )
}