List the files under a path by path, not by string prefix (closes #223)
check / check (push) Successful in 12m35s
check / check (push) Successful in 12m35s
FileRepository.ListByPrefix matched with SQL LIKE: a plain string prefix that ignores ASCII case and treats _ and % as wildcards. Restoring /home/u/doc also restored doc2, DOC and doc.txt.bak, and a backup counted the files of a longer sibling path as deleted. It is now ListUnderPath, which returns the file at the path and every file whose path starts with the path plus a slash, compared exactly. A trailing slash is ignored, so "/" still lists every file. Three tests relied on string-prefix matching and now name a full path or call ListAll. ListIDsWithChunksNotInUploadedBlobs keeps its LIKE: it only adds file IDs the scan never looks up. Model: opus-5-5
This commit is contained in:
@@ -228,19 +228,24 @@ func (r *FileRepository) DeleteByID(
|
||||
return nil
|
||||
}
|
||||
|
||||
// ListByPrefix returns all files whose path starts with prefix, ordered by
|
||||
// path.
|
||||
func (r *FileRepository) ListByPrefix(
|
||||
ctx context.Context, prefix string,
|
||||
// ListUnderPath returns the file at path and every file beneath it,
|
||||
// ordered by path. Paths are compared case-sensitively, and a trailing
|
||||
// slash on path is ignored, so "/" lists every file.
|
||||
func (r *FileRepository) ListUnderPath(
|
||||
ctx context.Context, path string,
|
||||
) ([]*File, error) {
|
||||
path = strings.TrimRight(path, "/")
|
||||
dirPrefix := path + "/"
|
||||
|
||||
// LIKE would ignore ASCII case and treat _ and % in path as wildcards.
|
||||
query := `
|
||||
SELECT id, path, source_path, mtime, size, mode, uid, gid, link_target
|
||||
FROM files
|
||||
WHERE path LIKE ? || '%'
|
||||
WHERE path = ? OR substr(path, 1, length(?)) = ?
|
||||
ORDER BY path
|
||||
`
|
||||
|
||||
rows, err := r.db.conn.QueryContext(ctx, query, prefix)
|
||||
rows, err := r.db.conn.QueryContext(ctx, query, path, dirPrefix, dirPrefix)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("querying files: %w", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user