@@ -3,6 +3,7 @@ package client
3
3
import (
4
4
"encoding/json"
5
5
"fmt"
6
+ "log/slog"
6
7
"os"
7
8
"path/filepath"
8
9
"strings"
@@ -11,51 +12,67 @@ import (
11
12
const MetadataFilename = ".knowledge.json"
12
13
13
14
type 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
15
17
// TODO (idea): add other fields like description here, so we can hierarchically build a dataset description? Challenge is pruning and merging.
16
18
}
17
19
18
20
type FileMetadata map [string ]any
19
21
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 ) {
21
26
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
+ }
28
40
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
+ }
33
47
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
44
51
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
53
69
}
54
70
}
55
71
56
- return mergedMetadata , nil
57
72
}
58
73
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
+
61
78
}
0 commit comments