fix: always close update channel and wait for goroutine exit
fix: copy label style to not affect it everywhere
This commit is contained in:
parent
b0111404aa
commit
6d5b929ef9
3 changed files with 58 additions and 38 deletions
|
@ -7,6 +7,7 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/satisfactorymodding/ficsit-cli/utils"
|
"github.com/satisfactorymodding/ficsit-cli/utils"
|
||||||
|
|
||||||
|
@ -341,19 +342,22 @@ func (i *Installation) Install(ctx *GlobalContext, updates chan InstallUpdate) e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
completed := 0
|
|
||||||
for modReference, version := range lockfile {
|
|
||||||
// Only install if a link is provided, otherwise assume mod is already installed
|
|
||||||
if version.Link != "" {
|
|
||||||
downloading := true
|
downloading := true
|
||||||
|
completed := 0
|
||||||
|
|
||||||
var genericUpdates chan utils.GenericUpdate
|
var genericUpdates chan utils.GenericUpdate
|
||||||
if updates != nil {
|
if updates != nil {
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
wg.Add(1)
|
||||||
|
defer wg.Wait()
|
||||||
|
|
||||||
genericUpdates = make(chan utils.GenericUpdate)
|
genericUpdates = make(chan utils.GenericUpdate)
|
||||||
|
defer close(genericUpdates)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
|
||||||
update := InstallUpdate{
|
update := InstallUpdate{
|
||||||
ModName: modReference,
|
|
||||||
OverallProgress: float64(completed) / float64(len(lockfile)),
|
OverallProgress: float64(completed) / float64(len(lockfile)),
|
||||||
DownloadProgress: 0,
|
DownloadProgress: 0,
|
||||||
ExtractProgress: 0,
|
ExtractProgress: 0,
|
||||||
|
@ -372,6 +376,12 @@ func (i *Installation) Install(ctx *GlobalContext, updates chan InstallUpdate) e
|
||||||
update.ExtractProgress = up.Progress
|
update.ExtractProgress = up.Progress
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if up.ModReference != nil {
|
||||||
|
update.ModName = *up.ModReference
|
||||||
|
}
|
||||||
|
|
||||||
|
update.OverallProgress = float64(completed) / float64(len(lockfile))
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case updates <- update:
|
case updates <- update:
|
||||||
default:
|
default:
|
||||||
|
@ -380,6 +390,18 @@ func (i *Installation) Install(ctx *GlobalContext, updates chan InstallUpdate) e
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for modReference, version := range lockfile {
|
||||||
|
// Only install if a link is provided, otherwise assume mod is already installed
|
||||||
|
if version.Link != "" {
|
||||||
|
downloading = true
|
||||||
|
|
||||||
|
if genericUpdates != nil {
|
||||||
|
select {
|
||||||
|
case genericUpdates <- utils.GenericUpdate{ModReference: &modReference}:
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.Info().Str("mod_reference", modReference).Str("version", version.Version).Str("link", version.Link).Msg("downloading mod")
|
log.Info().Str("mod_reference", modReference).Str("version", version.Version).Str("link", version.Link).Msg("downloading mod")
|
||||||
reader, size, err := utils.DownloadOrCache(modReference+"_"+version.Version+".zip", version.Hash, version.Link, genericUpdates)
|
reader, size, err := utils.DownloadOrCache(modReference+"_"+version.Version+".zip", version.Hash, version.Link, genericUpdates)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -392,10 +414,6 @@ func (i *Installation) Install(ctx *GlobalContext, updates chan InstallUpdate) e
|
||||||
if err := utils.ExtractMod(reader, size, filepath.Join(modsDirectory, modReference), version.Hash, genericUpdates); err != nil {
|
if err := utils.ExtractMod(reader, size, filepath.Join(modsDirectory, modReference), version.Hash, genericUpdates); err != nil {
|
||||||
return errors.Wrap(err, "could not extract "+modReference)
|
return errors.Wrap(err, "could not extract "+modReference)
|
||||||
}
|
}
|
||||||
|
|
||||||
if genericUpdates != nil {
|
|
||||||
close(genericUpdates)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
completed++
|
completed++
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/charmbracelet/bubbles/progress"
|
"github.com/charmbracelet/bubbles/progress"
|
||||||
tea "github.com/charmbracelet/bubbletea"
|
tea "github.com/charmbracelet/bubbletea"
|
||||||
"github.com/charmbracelet/lipgloss"
|
"github.com/charmbracelet/lipgloss"
|
||||||
|
|
||||||
"github.com/satisfactorymodding/ficsit-cli/cli"
|
"github.com/satisfactorymodding/ficsit-cli/cli"
|
||||||
"github.com/satisfactorymodding/ficsit-cli/tea/components"
|
"github.com/satisfactorymodding/ficsit-cli/tea/components"
|
||||||
"github.com/satisfactorymodding/ficsit-cli/tea/utils"
|
"github.com/satisfactorymodding/ficsit-cli/tea/utils"
|
||||||
|
@ -194,7 +195,7 @@ func (m apply) View() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
if m.status.done {
|
if m.status.done {
|
||||||
strs = append(strs, utils.LabelStyle.Padding(0).Margin(1).Render("Done! Press Enter to return"))
|
strs = append(strs, utils.LabelStyle.Copy().Padding(0).Margin(1).Render("Done! Press Enter to return"))
|
||||||
}
|
}
|
||||||
|
|
||||||
result := lipgloss.NewStyle().MarginLeft(1).Render(lipgloss.JoinVertical(lipgloss.Left, strs...))
|
result := lipgloss.NewStyle().MarginLeft(1).Render(lipgloss.JoinVertical(lipgloss.Left, strs...))
|
||||||
|
|
|
@ -43,6 +43,7 @@ func (pt *Progresser) Read(p []byte) (int, error) {
|
||||||
|
|
||||||
type GenericUpdate struct {
|
type GenericUpdate struct {
|
||||||
Progress float64
|
Progress float64
|
||||||
|
ModReference *string
|
||||||
}
|
}
|
||||||
|
|
||||||
func DownloadOrCache(cacheKey string, hash string, url string, updates chan GenericUpdate) (r io.ReaderAt, size int64, err error) {
|
func DownloadOrCache(cacheKey string, hash string, url string, updates chan GenericUpdate) (r io.ReaderAt, size int64, err error) {
|
||||||
|
|
Loading…
Reference in a new issue