forked from Elara6331/itd
		
	Merge pull request 'Add resource loading to ITD' (#28) from resource-loading into master
Reviewed-on: https://gitea.arsenm.dev/Arsen6331/itd/pulls/28
This commit is contained in:
		
							
								
								
									
										20
									
								
								api/fs.go
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								api/fs.go
									
									
									
									
									
								
							| @@ -2,6 +2,16 @@ package api | |||||||
|  |  | ||||||
| import "context" | import "context" | ||||||
|  |  | ||||||
|  | func (c *Client) RemoveAll(ctx context.Context, paths ...string) error { | ||||||
|  | 	return c.client.Call( | ||||||
|  | 		ctx, | ||||||
|  | 		"FS", | ||||||
|  | 		"RemoveAll", | ||||||
|  | 		paths, | ||||||
|  | 		nil, | ||||||
|  | 	) | ||||||
|  | } | ||||||
|  |  | ||||||
| func (c *Client) Remove(ctx context.Context, paths ...string) error { | func (c *Client) Remove(ctx context.Context, paths ...string) error { | ||||||
| 	return c.client.Call( | 	return c.client.Call( | ||||||
| 		ctx, | 		ctx, | ||||||
| @@ -22,6 +32,16 @@ func (c *Client) Rename(ctx context.Context, old, new string) error { | |||||||
| 	) | 	) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (c *Client) MkdirAll(ctx context.Context, paths ...string) error { | ||||||
|  | 	return c.client.Call( | ||||||
|  | 		ctx, | ||||||
|  | 		"FS", | ||||||
|  | 		"MkdirAll", | ||||||
|  | 		paths, | ||||||
|  | 		nil, | ||||||
|  | 	) | ||||||
|  | } | ||||||
|  |  | ||||||
| func (c *Client) Mkdir(ctx context.Context, paths ...string) error { | func (c *Client) Mkdir(ctx context.Context, paths ...string) error { | ||||||
| 	return c.client.Call( | 	return c.client.Call( | ||||||
| 		ctx, | 		ctx, | ||||||
|   | |||||||
							
								
								
									
										26
									
								
								api/resources.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								api/resources.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | package api | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  |  | ||||||
|  | 	"go.arsenm.dev/infinitime" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // LoadResources loads resources onto the watch from the given | ||||||
|  | // file path to the resources zip | ||||||
|  | func (c *Client) LoadResources(ctx context.Context, path string) (<-chan infinitime.ResourceLoadProgress, error) { | ||||||
|  | 	progCh := make(chan infinitime.ResourceLoadProgress) | ||||||
|  |  | ||||||
|  | 	err := c.client.Call( | ||||||
|  | 		ctx, | ||||||
|  | 		"FS", | ||||||
|  | 		"LoadResources", | ||||||
|  | 		path, | ||||||
|  | 		progCh, | ||||||
|  | 	) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return progCh, nil | ||||||
|  | } | ||||||
| @@ -11,6 +11,19 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| func fwUpgrade(c *cli.Context) error { | func fwUpgrade(c *cli.Context) error { | ||||||
|  | 	resources := c.String("resources") | ||||||
|  | 	if resources != "" { | ||||||
|  | 		absRes, err := filepath.Abs(resources) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		err = resLoad(c.Context, []string{absRes}) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	start := time.Now() | 	start := time.Now() | ||||||
|  |  | ||||||
| 	var upgType api.UpgradeType | 	var upgType api.UpgradeType | ||||||
|   | |||||||
| @@ -34,7 +34,12 @@ func fsMkdir(c *cli.Context) error { | |||||||
| 		return cli.Exit("Command mkdir requires one or more arguments", 1) | 		return cli.Exit("Command mkdir requires one or more arguments", 1) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := client.Mkdir(c.Context, c.Args().Slice()...) | 	var err error | ||||||
|  | 	if c.Bool("parents") { | ||||||
|  | 		err = client.MkdirAll(c.Context, c.Args().Slice()...) | ||||||
|  | 	} else { | ||||||
|  | 		err = client.Mkdir(c.Context, c.Args().Slice()...) | ||||||
|  | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| @@ -109,7 +114,12 @@ func fsRemove(c *cli.Context) error { | |||||||
| 		return cli.Exit("Command remove requires one or more arguments", 1) | 		return cli.Exit("Command remove requires one or more arguments", 1) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := client.Remove(c.Context, c.Args().Slice()...) | 	var err error | ||||||
|  | 	if c.Bool("recursive") { | ||||||
|  | 		err = client.RemoveAll(c.Context, c.Args().Slice()...) | ||||||
|  | 	} else { | ||||||
|  | 		err = client.Remove(c.Context, c.Args().Slice()...) | ||||||
|  | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| package main | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"time" |  | ||||||
| 	"context" | 	"context" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/signal" | 	"os/signal" | ||||||
| 	"syscall" | 	"syscall" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/rs/zerolog" | 	"github.com/rs/zerolog" | ||||||
| 	"github.com/rs/zerolog/log" | 	"github.com/rs/zerolog/log" | ||||||
| @@ -29,7 +29,7 @@ func main() { | |||||||
| 	// at most 200ms after the user sends SIGINT/SIGTERM. | 	// at most 200ms after the user sends SIGINT/SIGTERM. | ||||||
| 	go func() { | 	go func() { | ||||||
| 		<-ctx.Done() | 		<-ctx.Done() | ||||||
| 		time.Sleep(200*time.Millisecond) | 		time.Sleep(200 * time.Millisecond) | ||||||
| 		os.Exit(0) | 		os.Exit(0) | ||||||
| 	}() | 	}() | ||||||
|  |  | ||||||
| @@ -51,6 +51,19 @@ func main() { | |||||||
| 				Usage:     "Display help screen for a command", | 				Usage:     "Display help screen for a command", | ||||||
| 				Action:    helpCmd, | 				Action:    helpCmd, | ||||||
| 			}, | 			}, | ||||||
|  | 			{ | ||||||
|  | 				Name:    "resources", | ||||||
|  | 				Aliases: []string{"res"}, | ||||||
|  | 				Usage:   "Handle InfiniTime resource loading", | ||||||
|  | 				Subcommands: []*cli.Command{ | ||||||
|  | 					{ | ||||||
|  | 						Name:      "load", | ||||||
|  | 						ArgsUsage: "<path>", | ||||||
|  | 						Usage:     "Load an InifiniTime resources package", | ||||||
|  | 						Action:    resourcesLoad, | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
| 			{ | 			{ | ||||||
| 				Name:    "filesystem", | 				Name:    "filesystem", | ||||||
| 				Aliases: []string{"fs"}, | 				Aliases: []string{"fs"}, | ||||||
| @@ -64,6 +77,13 @@ func main() { | |||||||
| 						Action:    fsList, | 						Action:    fsList, | ||||||
| 					}, | 					}, | ||||||
| 					{ | 					{ | ||||||
|  | 						Flags: []cli.Flag{ | ||||||
|  | 							&cli.BoolFlag{ | ||||||
|  | 								Name:    "parents", | ||||||
|  | 								Aliases: []string{"p"}, | ||||||
|  | 								Usage:   "Make parent directories if needed, no error if already existing", | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
| 						Name:      "mkdir", | 						Name:      "mkdir", | ||||||
| 						ArgsUsage: "<paths...>", | 						ArgsUsage: "<paths...>", | ||||||
| 						Usage:     "Create new directories", | 						Usage:     "Create new directories", | ||||||
| @@ -84,6 +104,13 @@ func main() { | |||||||
| 						Action:      fsRead, | 						Action:      fsRead, | ||||||
| 					}, | 					}, | ||||||
| 					{ | 					{ | ||||||
|  | 						Flags: []cli.Flag{ | ||||||
|  | 							&cli.BoolFlag{ | ||||||
|  | 								Name:    "recursive", | ||||||
|  | 								Aliases: []string{"r", "R"}, | ||||||
|  | 								Usage:   "Remove directories and their contents recursively", | ||||||
|  | 							}, | ||||||
|  | 						}, | ||||||
| 						Name:      "remove", | 						Name:      "remove", | ||||||
| 						ArgsUsage: "<paths...>", | 						ArgsUsage: "<paths...>", | ||||||
| 						Aliases:   []string{"rm"}, | 						Aliases:   []string{"rm"}, | ||||||
| @@ -116,6 +143,11 @@ func main() { | |||||||
| 								Aliases: []string{"f"}, | 								Aliases: []string{"f"}, | ||||||
| 								Usage:   "Path to firmware image (.bin file)", | 								Usage:   "Path to firmware image (.bin file)", | ||||||
| 							}, | 							}, | ||||||
|  | 							&cli.PathFlag{ | ||||||
|  | 								Name:    "resources", | ||||||
|  | 								Aliases: []string{"r"}, | ||||||
|  | 								Usage:   "Path to resources file (.zip file)", | ||||||
|  | 							}, | ||||||
| 							&cli.PathFlag{ | 							&cli.PathFlag{ | ||||||
| 								Name:    "archive", | 								Name:    "archive", | ||||||
| 								Aliases: []string{"a"}, | 								Aliases: []string{"a"}, | ||||||
|   | |||||||
							
								
								
									
										53
									
								
								cmd/itctl/resources.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								cmd/itctl/resources.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | package main | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 	"path/filepath" | ||||||
|  |  | ||||||
|  | 	"github.com/cheggaaa/pb/v3" | ||||||
|  | 	"github.com/urfave/cli/v2" | ||||||
|  | 	"go.arsenm.dev/infinitime" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func resourcesLoad(c *cli.Context) error { | ||||||
|  | 	return resLoad(c.Context, c.Args().Slice()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func resLoad(ctx context.Context, args []string) error { | ||||||
|  | 	if len(args) == 0 { | ||||||
|  | 		return cli.Exit("Command load requires one argument.", 1) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Create progress bar templates | ||||||
|  | 	rmTmpl := `Removing {{string . "filename"}}` | ||||||
|  | 	upTmpl := `Uploading {{string . "filename"}} {{counters . }} B {{bar . "|" "-" (cycle .) " " "|"}} {{percent . }} {{rtime . "%s"}}` | ||||||
|  | 	// Start full bar at 0 total | ||||||
|  | 	bar := pb.ProgressBarTemplate(rmTmpl).Start(0) | ||||||
|  |  | ||||||
|  | 	path, err := filepath.Abs(args[0]) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	progCh, err := client.LoadResources(ctx, path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for evt := range progCh { | ||||||
|  | 		if evt.Operation == infinitime.ResourceOperationRemoveObsolete { | ||||||
|  | 			bar.SetTemplateString(rmTmpl) | ||||||
|  | 			bar.Set("filename", evt.Name) | ||||||
|  | 		} else { | ||||||
|  | 			bar.SetTemplateString(upTmpl) | ||||||
|  | 			bar.Set("filename", evt.Name) | ||||||
|  |  | ||||||
|  | 			bar.SetTotal(evt.Total) | ||||||
|  | 			bar.SetCurrent(evt.Sent) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bar.Finish() | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.mod
									
									
									
									
									
								
							| @@ -15,7 +15,7 @@ require ( | |||||||
| 	github.com/mozillazg/go-pinyin v0.19.0 | 	github.com/mozillazg/go-pinyin v0.19.0 | ||||||
| 	github.com/rs/zerolog v1.26.1 | 	github.com/rs/zerolog v1.26.1 | ||||||
| 	github.com/urfave/cli/v2 v2.3.0 | 	github.com/urfave/cli/v2 v2.3.0 | ||||||
| 	go.arsenm.dev/infinitime v0.0.0-20220819210252-d199fba93c2f | 	go.arsenm.dev/infinitime v0.0.0-20221016193942-01970b2bb770 | ||||||
| 	go.arsenm.dev/lrpc v0.0.0-20220513001344-3bcc01fdb6a0 | 	go.arsenm.dev/lrpc v0.0.0-20220513001344-3bcc01fdb6a0 | ||||||
| 	golang.org/x/text v0.3.7 | 	golang.org/x/text v0.3.7 | ||||||
| 	modernc.org/sqlite v1.17.2 | 	modernc.org/sqlite v1.17.2 | ||||||
| @@ -38,7 +38,7 @@ require ( | |||||||
| 	github.com/gopherjs/gopherjs v1.17.2 // indirect | 	github.com/gopherjs/gopherjs v1.17.2 // indirect | ||||||
| 	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect | 	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect | ||||||
| 	github.com/mattn/go-colorable v0.1.8 // indirect | 	github.com/mattn/go-colorable v0.1.8 // indirect | ||||||
| 	github.com/mattn/go-runewidth v0.0.12 // indirect | 	github.com/mattn/go-runewidth v0.0.13 // indirect | ||||||
| 	github.com/mitchellh/copystructure v1.2.0 // indirect | 	github.com/mitchellh/copystructure v1.2.0 // indirect | ||||||
| 	github.com/mitchellh/mapstructure v1.5.0 // indirect | 	github.com/mitchellh/mapstructure v1.5.0 // indirect | ||||||
| 	github.com/mitchellh/reflectwalk v1.0.2 // indirect | 	github.com/mitchellh/reflectwalk v1.0.2 // indirect | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								go.sum
									
									
									
									
									
								
							| @@ -270,8 +270,9 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx | |||||||
| github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | ||||||
| github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= | github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= | ||||||
| github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | ||||||
| github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= |  | ||||||
| github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= | github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= | ||||||
|  | github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= | ||||||
|  | github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= | ||||||
| github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= | github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= | ||||||
| github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | ||||||
| github.com/metal3d/fyne-x v0.0.0-20220508095732-177117e583fb h1:+fP6ENsbd+BUOmD/kSjNtrOmi2vgJ/JfWDSWjTKmTVY= | github.com/metal3d/fyne-x v0.0.0-20220508095732-177117e583fb h1:+fP6ENsbd+BUOmD/kSjNtrOmi2vgJ/JfWDSWjTKmTVY= | ||||||
| @@ -396,8 +397,8 @@ github.com/yuin/goldmark v1.3.8/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 | |||||||
| github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | ||||||
| github.com/yuin/goldmark v1.4.4 h1:zNWRjYUW32G9KirMXYHQHVNFkXvMI7LpgNW2AgYAoIs= | github.com/yuin/goldmark v1.4.4 h1:zNWRjYUW32G9KirMXYHQHVNFkXvMI7LpgNW2AgYAoIs= | ||||||
| github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= | github.com/yuin/goldmark v1.4.4/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= | ||||||
| go.arsenm.dev/infinitime v0.0.0-20220819210252-d199fba93c2f h1:Np0ZNlgVC5D9NOilN14HJ1mSXM8vl2LYGfK0fZOYUbY= | go.arsenm.dev/infinitime v0.0.0-20221016193942-01970b2bb770 h1:OZ8kYFHCXt+7nxz9G0BTnSyJKnIpQnQ5m7kyIssG81Y= | ||||||
| go.arsenm.dev/infinitime v0.0.0-20220819210252-d199fba93c2f/go.mod h1:K3NJ6fyPv5qqHUedB3MccKOE0whJMJZ80l/yTzzTrgc= | go.arsenm.dev/infinitime v0.0.0-20221016193942-01970b2bb770/go.mod h1:K3NJ6fyPv5qqHUedB3MccKOE0whJMJZ80l/yTzzTrgc= | ||||||
| go.arsenm.dev/lrpc v0.0.0-20220513001344-3bcc01fdb6a0 h1:1K96g1eww+77GeGchwMhd0NTrs7Mk/Hc3M3ItW5NbG4= | go.arsenm.dev/lrpc v0.0.0-20220513001344-3bcc01fdb6a0 h1:1K96g1eww+77GeGchwMhd0NTrs7Mk/Hc3M3ItW5NbG4= | ||||||
| go.arsenm.dev/lrpc v0.0.0-20220513001344-3bcc01fdb6a0/go.mod h1:goK9z735lfXmqlDxu9qN7FS8t0HJHN3PjyDtCToUY4w= | go.arsenm.dev/lrpc v0.0.0-20220513001344-3bcc01fdb6a0/go.mod h1:goK9z735lfXmqlDxu9qN7FS8t0HJHN3PjyDtCToUY4w= | ||||||
| go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= | go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= | ||||||
|   | |||||||
							
								
								
									
										48
									
								
								socket.go
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								socket.go
									
									
									
									
									
								
							| @@ -293,6 +293,17 @@ type FS struct { | |||||||
| 	fs  *blefs.FS | 	fs  *blefs.FS | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (fs *FS) RemoveAll(_ *server.Context, paths []string) error { | ||||||
|  | 	fs.updateFS() | ||||||
|  | 	for _, path := range paths { | ||||||
|  | 		err := fs.fs.RemoveAll(path) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func (fs *FS) Remove(_ *server.Context, paths []string) error { | func (fs *FS) Remove(_ *server.Context, paths []string) error { | ||||||
| 	fs.updateFS() | 	fs.updateFS() | ||||||
| 	for _, path := range paths { | 	for _, path := range paths { | ||||||
| @@ -309,6 +320,17 @@ func (fs *FS) Rename(_ *server.Context, paths [2]string) error { | |||||||
| 	return fs.fs.Rename(paths[0], paths[1]) | 	return fs.fs.Rename(paths[0], paths[1]) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (fs *FS) MkdirAll(_ *server.Context, paths []string) error { | ||||||
|  | 	fs.updateFS() | ||||||
|  | 	for _, path := range paths { | ||||||
|  | 		err := fs.fs.MkdirAll(path) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func (fs *FS) Mkdir(_ *server.Context, paths []string) error { | func (fs *FS) Mkdir(_ *server.Context, paths []string) error { | ||||||
| 	fs.updateFS() | 	fs.updateFS() | ||||||
| 	for _, path := range paths { | 	for _, path := range paths { | ||||||
| @@ -424,6 +446,32 @@ func (fs *FS) Download(ctx *server.Context, paths [2]string) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (fs *FS) LoadResources(ctx *server.Context, path string) error { | ||||||
|  | 	resFl, err := os.Open(path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	progCh, err := infinitime.LoadResources(resFl, fs.fs) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	ch, err := ctx.MakeChannel() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	go func() { | ||||||
|  | 		for evt := range progCh { | ||||||
|  | 			ch <- evt | ||||||
|  | 		} | ||||||
|  | 		close(ch) | ||||||
|  | 	}() | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func (fs *FS) updateFS() { | func (fs *FS) updateFS() { | ||||||
| 	if fs.fs == nil || updateFS { | 	if fs.fs == nil || updateFS { | ||||||
| 		// Get new FS | 		// Get new FS | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user