func (f *fakeSnappyBackend) ForeignTask(kind string, status state.Status, ss *snapstate.SnapSetup) { f.ops = append(f.ops, fakeOp{ op: kind + ":" + status.String(), name: ss.Name(), revno: ss.Revision(), }) }
// patch2: // - migrates SnapSetup.Name to SnapSetup.SideInfo.RealName // - backfills SnapState.{Sequence,Candidate}.RealName if its missing func patch2(s *state.State) error { var stateMap map[string]*OldSnapState err := s.Get("snaps", &stateMap) if err == state.ErrNoState { return nil } if err != nil { return err } // migrate SnapSetup in all tasks: // - the new SnapSetup uses SideInfo, backfil from Candidate // - also move SnapSetup.{Name,Revision} into SnapSetup.SideInfo.{RealName,Revision} var oldSS OldSnapSetup var newSS snapstate.SnapSetup for _, t := range s.Tasks() { err := t.Get("snap-setup", &oldSS) if err == state.ErrNoState { continue } if err != nil && err != state.ErrNoState { return err } // some things stay the same newSS.Channel = oldSS.Channel newSS.Flags = oldSS.Flags newSS.SnapPath = oldSS.SnapPath newSS.DownloadInfo = oldSS.DownloadInfo newSS.SideInfo = oldSS.SideInfo // ... and some change if newSS.SideInfo == nil { newSS.SideInfo = &snap.SideInfo{} if snapst, ok := stateMap[oldSS.Name]; ok && snapst.Candidate != nil { newSS.SideInfo = snapst.Candidate } } if newSS.SideInfo.RealName == "" { newSS.SideInfo.RealName = oldSS.Name } if newSS.SideInfo.Revision.Unset() { newSS.SideInfo.Revision = oldSS.Revision } t.Set("snap-setup", &newSS) } // backfill snapstate.SnapState.{Sequence,Candidate} with RealName // (if that is missing, was missing for e.g. sideloaded snaps) for snapName, snapState := range stateMap { for _, si := range snapState.Sequence { setRealName(si, snapName) } } s.Set("snaps", stateMap) return nil }