Parcourir la source

feat: support dify ignore

Yeuoly il y a 10 mois
Parent
commit
0d5d53bdef

+ 1 - 0
internal/core/plugin_packager/.difyignore

@@ -0,0 +1 @@
+ignored

+ 46 - 5
internal/core/plugin_packager/decoder/fs.go

@@ -1,6 +1,7 @@
 package decoder
 
 import (
+	"bufio"
 	"errors"
 	"io"
 	"io/fs"
@@ -60,15 +61,55 @@ func (d *FSPluginDecoder) Open() error {
 }
 
 func (d *FSPluginDecoder) Walk(fn func(filename string, dir string) error) error {
-	return filepath.Walk(d.root, func(path string, info fs.FileInfo, err error) error {
-		if info.IsDir() {
-			return nil
-		}
+	// dify_ignores is a map[string][]string, the key is the directory, the value is a list of files to ignore
+	dify_ignores := make(map[string][]string)
 
+	return filepath.Walk(d.root, func(path string, info fs.FileInfo, err error) error {
 		// trim the first directory path
 		path = strings.TrimPrefix(path, d.root)
 		// trim / from the beginning
 		path = strings.TrimPrefix(path, "/")
+		p := filepath.Dir(path)
+
+		if info.IsDir() {
+			// try read the .difyignore file if it's the first time to walk this directory
+			if _, ok := dify_ignores[p]; !ok {
+				dify_ignores[p] = make([]string, 0)
+				// read the .difyignore file if it exists
+				ignore_file_path := filepath.Join(d.root, p, ".difyignore")
+				if _, err := os.Stat(ignore_file_path); err == nil {
+					ignore_file, err := os.Open(ignore_file_path)
+					if err != nil {
+						return err
+					}
+
+					scanner := bufio.NewScanner(ignore_file)
+					for scanner.Scan() {
+						line := scanner.Text()
+						if strings.HasPrefix(line, "#") {
+							continue
+						}
+						dify_ignores[p] = append(dify_ignores[p], line)
+					}
+
+					ignore_file.Close()
+				}
+			}
+
+			return nil
+		}
+
+		current_ignore_files := dify_ignores[p]
+		for _, ignore_file := range current_ignore_files {
+			// skip if match
+			matched, err := filepath.Match(ignore_file, info.Name())
+			if err != nil {
+				return err
+			}
+			if matched {
+				return nil
+			}
+		}
 
 		if path == "" {
 			return nil
@@ -78,7 +119,7 @@ func (d *FSPluginDecoder) Walk(fn func(filename string, dir string) error) error
 			return err
 		}
 
-		return fn(info.Name(), filepath.Dir(path))
+		return fn(info.Name(), p)
 	})
 }
 

+ 1 - 0
internal/core/plugin_packager/ignored

@@ -0,0 +1 @@
+hhhh

+ 31 - 0
internal/core/plugin_packager/packager_test.go

@@ -2,6 +2,7 @@ package plugin_packager
 
 import (
 	_ "embed"
+	"fmt"
 	"os"
 	"testing"
 
@@ -17,6 +18,12 @@ var manifest []byte
 //go:embed neko.yaml
 var neko []byte
 
+//go:embed .difyignore
+var dify_ignore []byte
+
+//go:embed ignored
+var ignored []byte
+
 //go:embed _assets/test.svg
 var test_svg []byte
 
@@ -43,6 +50,18 @@ func TestPackagerAndVerifier(t *testing.T) {
 		return
 	}
 
+	// create .difyignore
+	if err := os.WriteFile("temp/.difyignore", dify_ignore, 0644); err != nil {
+		t.Errorf("failed to write .difyignore: %s", err.Error())
+		return
+	}
+
+	// create ignored
+	if err := os.WriteFile("temp/ignored", ignored, 0644); err != nil {
+		t.Errorf("failed to write ignored: %s", err.Error())
+		return
+	}
+
 	if err := os.MkdirAll("temp/_assets", 0755); err != nil {
 		t.Errorf("failed to create _assets directory: %s", err.Error())
 		return
@@ -59,6 +78,18 @@ func TestPackagerAndVerifier(t *testing.T) {
 		return
 	}
 
+	// walk
+	err = origin_decoder.Walk(func(filename string, dir string) error {
+		if filename == "ignored" {
+			return fmt.Errorf("should not walk into ignored")
+		}
+		return nil
+	})
+	if err != nil {
+		t.Errorf("failed to walk: %s", err.Error())
+		return
+	}
+
 	// check assets
 	assets, err := origin_decoder.Assets()
 	if err != nil {