6b0bdc5eeb
* bump gopkg.in/yaml.v3 * test: cannot remove local items with cscli * test dangling links * test: cannot install local item with cscli * pkg/cwhub: reorg (move) functions in files * allow hub upgrade with local items * data download: honor Last-Modified header * fatal -> warning when attempting to remove a local item (allows remove --all) * cscli...inspect -o yaml|human: rename remote_path -> path * Correct count of removed items Still no separate counter for the --purge option, but should be clear enough
70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
package cwhub
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// enable enables the item by creating a symlink to the downloaded content, and also enables sub-items.
|
|
func (i *Item) enable() error {
|
|
if i.State.Installed {
|
|
if i.State.Tainted {
|
|
return fmt.Errorf("%s is tainted, won't enable unless --force", i.Name)
|
|
}
|
|
|
|
if i.IsLocal() {
|
|
return fmt.Errorf("%s is local, won't enable", i.Name)
|
|
}
|
|
|
|
// if it's a collection, check sub-items even if the collection file itself is up-to-date
|
|
if i.State.UpToDate && !i.HasSubItems() {
|
|
log.Tracef("%s is installed and up-to-date, skip.", i.Name)
|
|
return nil
|
|
}
|
|
}
|
|
|
|
for _, sub := range i.SubItems() {
|
|
if err := sub.enable(); err != nil {
|
|
return fmt.Errorf("while installing %s: %w", sub.Name, err)
|
|
}
|
|
}
|
|
|
|
if err := i.createInstallLink(); err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Infof("Enabled %s: %s", i.Type, i.Name)
|
|
i.State.Installed = true
|
|
|
|
return nil
|
|
}
|
|
|
|
// Install installs the item from the hub, downloading it if needed.
|
|
func (i *Item) Install(force bool, downloadOnly bool) error {
|
|
if downloadOnly && i.State.Downloaded && i.State.UpToDate {
|
|
log.Infof("%s is already downloaded and up-to-date", i.Name)
|
|
|
|
if !force {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
filePath, err := i.downloadLatest(force, true)
|
|
if err != nil {
|
|
return fmt.Errorf("while downloading %s: %w", i.Name, err)
|
|
}
|
|
|
|
if downloadOnly {
|
|
log.Infof("Downloaded %s to %s", i.Name, filePath)
|
|
return nil
|
|
}
|
|
|
|
if err := i.enable(); err != nil {
|
|
return fmt.Errorf("while enabling %s: %w", i.Name, err)
|
|
}
|
|
|
|
log.Infof("Enabled %s", i.Name)
|
|
|
|
return nil
|
|
}
|