| 90 | } |
| 91 | |
| 92 | func (a *App) Delete(ctx context.Context, opts deleteOptions) (err error) { |
| 93 | var codespaces []*api.Codespace |
| 94 | nameFilter := opts.codespaceName |
| 95 | if nameFilter == "" { |
| 96 | err = a.RunWithProgress("Fetching codespaces", func() (fetchErr error) { |
| 97 | userName := opts.userName |
| 98 | if userName == "" && opts.orgName != "" { |
| 99 | currentUser, fetchErr := a.apiClient.GetUser(ctx) |
| 100 | if fetchErr != nil { |
| 101 | return fetchErr |
| 102 | } |
| 103 | userName = currentUser.Login |
| 104 | } |
| 105 | codespaces, fetchErr = a.apiClient.ListCodespaces(ctx, api.ListCodespacesOptions{OrgName: opts.orgName, UserName: userName}) |
| 106 | if opts.repoOwner != "" { |
| 107 | codespaces = filterCodespacesByRepoOwner(codespaces, opts.repoOwner) |
| 108 | } |
| 109 | return |
| 110 | }) |
| 111 | if err != nil { |
| 112 | return fmt.Errorf("error getting codespaces: %w", err) |
| 113 | } |
| 114 | |
| 115 | if !opts.deleteAll && opts.repoFilter == "" { |
| 116 | includeUsername := opts.orgName != "" |
| 117 | c, err := chooseCodespaceFromList(ctx, codespaces, includeUsername, false) |
| 118 | if err != nil { |
| 119 | return fmt.Errorf("error choosing codespace: %w", err) |
| 120 | } |
| 121 | nameFilter = c.Name |
| 122 | } |
| 123 | } else { |
| 124 | var codespace *api.Codespace |
| 125 | err := a.RunWithProgress("Fetching codespace", func() (fetchErr error) { |
| 126 | if opts.orgName == "" || opts.userName == "" { |
| 127 | codespace, fetchErr = a.apiClient.GetCodespace(ctx, nameFilter, false) |
| 128 | } else { |
| 129 | codespace, fetchErr = a.apiClient.GetOrgMemberCodespace(ctx, opts.orgName, opts.userName, opts.codespaceName) |
| 130 | } |
| 131 | return |
| 132 | }) |
| 133 | if err != nil { |
| 134 | return fmt.Errorf("error fetching codespace information: %w", err) |
| 135 | } |
| 136 | |
| 137 | codespaces = []*api.Codespace{codespace} |
| 138 | } |
| 139 | |
| 140 | codespacesToDelete := make([]*api.Codespace, 0, len(codespaces)) |
| 141 | lastUpdatedCutoffTime := opts.now().AddDate(0, 0, -int(opts.keepDays)) |
| 142 | for _, c := range codespaces { |
| 143 | if nameFilter != "" && c.Name != nameFilter { |
| 144 | continue |
| 145 | } |
| 146 | if opts.repoFilter != "" && !strings.EqualFold(c.Repository.FullName, opts.repoFilter) { |
| 147 | continue |
| 148 | } |
| 149 | |