MCPcopy Create free account
hub / github.com/krau/SaveAny-Bot / ListFiles

Method ListFiles

storage/rclone/rclone.go:166–213  ·  view source on GitHub ↗

ListFiles implements storage.StorageListable

(ctx context.Context, dirPath string)

Source from the content-addressed store, hash-verified

164
165// ListFiles implements storage.StorageListable
166func (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
216func (r *Rclone) OpenFile(ctx context.Context, filePath string) (io.ReadCloser, int64, error) {

Callers

nothing calls this directly

Calls 5

getRemotePathMethod · 0.95
buildBaseArgsMethod · 0.95
RunMethod · 0.80
ParseMethod · 0.65
StringMethod · 0.45

Tested by

no test coverage detected