ListFiles implements storage.StorageListable
(ctx context.Context, dirPath string)
| 164 | |
| 165 | // ListFiles implements storage.StorageListable |
| 166 | func (r *Rclone) ListFiles(ctx context.Context, dirPath string) ([]storagetypes.FileInfo, error) { |
| 167 | r.logger.Infof("Listing files in %s", dirPath) |
| 168 | |
| 169 | remotePath := r.getRemotePath(dirPath) |
| 170 | |
| 171 | args := r.buildBaseArgs() |
| 172 | args = append(args, "lsjson", remotePath) |
| 173 | |
| 174 | cmd := exec.CommandContext(ctx, "rclone", args...) |
| 175 | var stdout, stderr bytes.Buffer |
| 176 | cmd.Stdout = &stdout |
| 177 | cmd.Stderr = &stderr |
| 178 | |
| 179 | if err := cmd.Run(); err != nil { |
| 180 | r.logger.Errorf("Failed to list files: %v, stderr: %s", err, stderr.String()) |
| 181 | return nil, fmt.Errorf("%w: %s", ErrFailedToListFiles, stderr.String()) |
| 182 | } |
| 183 | |
| 184 | var items []lsjsonItem |
| 185 | if err := json.Unmarshal(stdout.Bytes(), &items); err != nil { |
| 186 | r.logger.Errorf("Failed to parse lsjson output: %v", err) |
| 187 | return nil, fmt.Errorf("failed to parse lsjson output: %w", err) |
| 188 | } |
| 189 | |
| 190 | files := make([]storagetypes.FileInfo, 0, len(items)) |
| 191 | for _, item := range items { |
| 192 | var modTime time.Time |
| 193 | if item.ModTime != "" { |
| 194 | parsedTime, err := time.Parse(time.RFC3339Nano, item.ModTime) |
| 195 | if err != nil { |
| 196 | r.logger.Warnf("Failed to parse mod time %q for %s: %v", item.ModTime, item.Name, err) |
| 197 | } else { |
| 198 | modTime = parsedTime |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | files = append(files, storagetypes.FileInfo{ |
| 203 | Name: item.Name, |
| 204 | Path: path.Join(dirPath, item.Name), |
| 205 | Size: item.Size, |
| 206 | IsDir: item.IsDir, |
| 207 | ModTime: modTime, |
| 208 | }) |
| 209 | } |
| 210 | |
| 211 | r.logger.Debugf("Found %d files/directories in %s", len(files), dirPath) |
| 212 | return files, nil |
| 213 | } |
| 214 | |
| 215 | // OpenFile implements storage.StorageReadable |
| 216 | func (r *Rclone) OpenFile(ctx context.Context, filePath string) (io.ReadCloser, int64, error) { |
nothing calls this directly
no test coverage detected