summaryrefslogtreecommitdiffstats
path: root/pkg/gui/controllers/helpers/update_helper.go
blob: f50a757deb4774b4eae155afafc8030e9cd5c03c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package helpers

import (
	"errors"

	"github.com/jesseduffield/gocui"
	"github.com/jesseduffield/lazygit/pkg/gui/types"
	"github.com/jesseduffield/lazygit/pkg/updates"
	"github.com/jesseduffield/lazygit/pkg/utils"
)

type UpdateHelper struct {
	c       *HelperCommon
	updater *updates.Updater
}

func NewUpdateHelper(c *HelperCommon, updater *updates.Updater) *UpdateHelper {
	return &UpdateHelper{
		c:       c,
		updater: updater,
	}
}

func (self *UpdateHelper) CheckForUpdateInBackground() {
	self.updater.CheckForNewUpdate(func(newVersion string, err error) error {
		if err != nil {
			// ignoring the error for now so that I'm not annoying users
			self.c.Log.Error(err.Error())
			return nil
		}
		if newVersion == "" {
			return nil
		}
		if self.c.UserConfig.Update.Method == "background" {
			self.startUpdating(newVersion)
			return nil
		}
		return self.showUpdatePrompt(newVersion)
	}, false)
}

func (self *UpdateHelper) CheckForUpdateInForeground() error {
	return self.c.WithWaitingStatus(self.c.Tr.CheckingForUpdates, func(gocui.Task) error {
		self.updater.CheckForNewUpdate(func(newVersion string, err error) error {
			if err != nil {
				return err
			}
			if newVersion == "" {
				return errors.New(self.c.Tr.FailedToRetrieveLatestVersionErr)
			}
			return self.showUpdatePrompt(newVersion)
		}, true)

		return nil
	})
}

func (self *UpdateHelper) startUpdating(newVersion string) {
	_ = self.c.WithWaitingStatus(self.c.Tr.UpdateInProgressWaitingStatus, func(gocui.Task) error {
		self.c.State().SetUpdating(true)
		err := self.updater.Update(newVersion)
		return self.onUpdateFinish(err)
	})
}

func (self *UpdateHelper) onUpdateFinish(err error) error {
	self.c.State().SetUpdating(false)
	self.c.OnUIThread(func() error {
		self.c.SetViewContent(self.c.Views().AppStatus, "")
		if err != nil {
			errMessage := utils.ResolvePlaceholderString(
				self.c.Tr.UpdateFailedErr, map[string]string{
					"errMessage": err.Error(),
				},
			)
			return errors.New(errMessage)
		}
		return self.c.Alert(self.c.Tr.UpdateCompletedTitle, self.c.Tr.UpdateCompleted)
	})

	return nil
}

func (self *UpdateHelper) showUpdatePrompt(newVersion string) error {
	message := utils.ResolvePlaceholderString(
		self.c.Tr.UpdateAvailable, map[string]string{
			"newVersion": newVersion,
		},
	)

	return self.c.Confirm(types.ConfirmOpts{
		Title:  self.c.Tr.UpdateAvailableTitle,
		Prompt: message,
		HandleConfirm: func() error {
			self.startUpdating(newVersion)
			return nil
		},
	})
}