35
34
type InstallFlags uint
38
// AllowUnauthenticated allows to install a snap even if it can not be authenticated
37
// AllowUnauthenticated allows to install a snap even if it cannot be authenticated
39
38
AllowUnauthenticated InstallFlags = 1 << iota
40
39
// InhibitHooks will ensure that the hooks are not run
48
func doUpdate(part Part, flags InstallFlags, meter progress.Meter) error {
49
if _, err := part.Install(meter, flags); err == ErrSideLoaded {
47
func installRemote(mStore *SnapUbuntuStoreRepository, remoteSnap *RemoteSnapPart, flags InstallFlags, meter progress.Meter) (string, error) {
48
downloadedSnap, err := mStore.Download(remoteSnap, meter)
50
return "", fmt.Errorf("cannot download %s: %s", remoteSnap.Name(), err)
52
defer os.Remove(downloadedSnap)
54
if err := remoteSnap.saveStoreManifest(); err != nil {
58
localSnap, err := (&Overlord{}).Install(downloadedSnap, remoteSnap.Origin(), flags, meter)
63
return localSnap.Name(), nil
66
func doUpdate(mStore *SnapUbuntuStoreRepository, part Part, flags InstallFlags, meter progress.Meter) error {
67
_, err := installRemote(mStore, part.(*RemoteSnapPart), flags, meter)
68
if err == ErrSideLoaded {
50
69
logger.Noticef("Skipping sideloaded package: %s", part.Name())
52
71
} else if err != nil {
55
75
if err := GarbageCollect(part.Name(), flags, meter); err != nil {
100
120
return nil, ErrNotInstalled
123
mStore := NewUbuntuStoreSnapRepository()
104
125
// TODO: query the store for just this package, instead of this
105
updates, err := ListUpdates()
126
updates, err := mStore.Updates()
128
return nil, fmt.Errorf("cannot get updates: %s", err)
106
130
upd := FindSnapsByName(QualifiedName(cur[0]), updates)
107
131
if len(upd) < 1 {
108
return nil, fmt.Errorf("no update found for %s", name)
132
return nil, fmt.Errorf("cannot find any update for %q", name)
111
if err := doUpdate(upd[0], flags, meter); err != nil {
135
if err := doUpdate(mStore, upd[0], flags, meter); err != nil {
124
148
// if updates where available and an error and nil if any of the updates
125
149
// fail to apply.
126
150
func UpdateAll(flags InstallFlags, meter progress.Meter) ([]Part, error) {
127
updates, err := ListUpdates()
151
mStore := NewUbuntuStoreSnapRepository()
152
updates, err := mStore.Updates()
132
157
for _, part := range updates {
133
158
meter.Notify(fmt.Sprintf("Updating %s (%s)", part.Name(), part.Version()))
134
if err := doUpdate(part, flags, meter); err != nil {
159
if err := doUpdate(mStore, part, flags, meter); err != nil {
176
201
// check repos next
177
mStore := NewMetaStoreRepository()
202
mStore := NewUbuntuStoreSnapRepository()
178
203
installed, err := NewMetaLocalRepository().Installed()
184
idx := strings.IndexRune(name, '.')
186
origin = name[idx+1:]
190
found, err := mStore.Details(name, origin)
208
part, err := mStore.Snap(name)
195
for _, part := range found {
196
cur := FindSnapsByNameAndVersion(QualifiedName(part), part.Version(), installed)
198
return "", ErrAlreadyInstalled
200
if PackageNameActive(part.Name()) {
201
return "", ErrPackageNameAlreadyInstalled
204
// TODO block gadget snaps here once the store supports package types
206
return part.Install(meter, flags)
209
return "", ErrPackageNotFound
213
cur := FindSnapsByNameAndVersion(QualifiedName(part), part.Version(), installed)
215
return "", ErrAlreadyInstalled
217
if PackageNameActive(part.Name()) {
218
return "", ErrPackageNameAlreadyInstalled
221
return installRemote(mStore, part, flags, meter)
212
224
// GarbageCollect removes all versions two older than the current active