@@ -3,6 +3,7 @@ package client
33import (
44 "encoding/json"
55 "fmt"
6+ "log/slog"
67 "os"
78 "path/filepath"
89 "strings"
@@ -11,51 +12,67 @@ import (
1112const MetadataFilename = ".knowledge.json"
1213
1314type Metadata struct {
14- Metadata map [string ]FileMetadata `json:"metadata"` // Map of file paths to metadata
15+ MetadataFileAbsPath string
16+ Metadata map [string ]FileMetadata `json:"metadata"` // Map of file paths to metadata
1517 // TODO (idea): add other fields like description here, so we can hierarchically build a dataset description? Challenge is pruning and merging.
1618}
1719
1820type FileMetadata map [string ]any
1921
20- func loadAndMergeMetadata (dirPath string , parentMetadata * Metadata ) (* Metadata , error ) {
22+ // loadAndMergeMetadata checks if the given directory contains a metadata file.
23+ // If so, it reads it in and merges it with the previous level of metadata.
24+ // Doing so, the parentMetadata is trimmed down to only the entries relevant to this directory.
25+ func loadDirMetadata (dirPath string ) (* Metadata , error ) {
2126 metadataPath := filepath .Join (dirPath , MetadataFilename )
22- dirName := filepath .Base (dirPath )
23- if _ , err := os .Stat (metadataPath ); err == nil { // Metadata file exists
24- fileContent , err := os .ReadFile (metadataPath )
25- if err != nil {
26- return nil , fmt .Errorf ("failed to read metadata file %s: %w" , metadataPath , err )
27- }
27+ metaAbsPath , err := filepath .Abs (metadataPath )
28+ if err != nil {
29+ return nil , fmt .Errorf ("failed to get absolute path for %s: %w" , metadataPath , err )
30+ }
31+ dirPath = filepath .Dir (metadataPath )
32+ if _ , err := os .Stat (metadataPath ); err != nil {
33+ return nil , nil
34+ }
35+ // Metadata file exists
36+ fileContent , err := os .ReadFile (metadataPath )
37+ if err != nil {
38+ return nil , fmt .Errorf ("failed to read metadata file %s: %w" , metadataPath , err )
39+ }
2840
29- var newMetadata Metadata
30- if err := json .Unmarshal (fileContent , & newMetadata ); err != nil {
31- return nil , fmt .Errorf ("failed to unmarshal metadata file %s: %w" , metadataPath , err )
32- }
41+ metadata := & Metadata {
42+ MetadataFileAbsPath : metaAbsPath ,
43+ }
44+ if err := json .Unmarshal (fileContent , & metadata ); err != nil {
45+ return nil , fmt .Errorf ("failed to unmarshal metadata file %s: %w" , metadataPath , err )
46+ }
3347
34- // Merge with parent metadata, overriding existing keys
35- mergedMetadata := & Metadata {Metadata : make (map [string ]FileMetadata , len (parentMetadata .Metadata )+ len (newMetadata .Metadata ))}
36- for filename , fileMetadata := range parentMetadata .Metadata {
37- if ! strings .HasPrefix (filename , dirName ) {
38- // skip entries which are not meant for this (sub-)directory
39- continue
40- }
41- fname := strings .TrimPrefix (strings .TrimPrefix (filename , dirName ), string (filepath .Separator ))
42- mergedMetadata .Metadata [fname ] = fileMetadata
43- }
48+ slog .Info ("Loaded metadata" , "path" , metadataPath , "metadata" , metadata .Metadata )
49+
50+ return metadata , nil
4451
45- if newMetadata .Metadata != nil {
46- for filename , fileMetadata := range newMetadata .Metadata {
47- for k , v := range fileMetadata {
48- if mergedMetadata .Metadata [filename ] == nil {
49- mergedMetadata .Metadata [filename ] = make (FileMetadata , len (fileMetadata ))
50- }
51- mergedMetadata.Metadata [filename ][k ] = v
52- }
52+ }
53+
54+ func findMetadata (path string , metadataStack []Metadata ) (FileMetadata , error ) {
55+
56+ absPath , err := filepath .Abs (path )
57+ if err != nil {
58+ return nil , err
59+ }
60+
61+ metadata := make (map [string ]any )
62+
63+ for _ , metadataEntry := range metadataStack {
64+ target := strings .TrimPrefix (strings .TrimPrefix (absPath , filepath .Dir (metadataEntry .MetadataFileAbsPath )), string (filepath .Separator ))
65+
66+ if m , ok := metadataEntry .Metadata [target ]; ok {
67+ for k , v := range m {
68+ metadata [k ] = v
5369 }
5470 }
5571
56- return mergedMetadata , nil
5772 }
5873
59- // No metadata file, return parent metadata as is
60- return parentMetadata , nil
74+ slog .Debug ("Found metadata" , "path" , path , "metadata" , metadata )
75+
76+ return metadata , nil
77+
6178}
0 commit comments