aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-05-11 11:30:50 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-05-11 11:30:50 +0200
commit8af00445f3bcfbaedb14792b4e2304a2b2470cce (patch)
tree7b73cbf549cb7d2d1b2e6fb2ffaa2224c119d84c
parentd4deaf0b8e88123b15ae7358c7bc049c143084fa (diff)
feat: commande CLI delete pour supprimer une galerie
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
-rw-r--r--README.md11
-rw-r--r--gallery.go59
2 files changed, 67 insertions, 3 deletions
diff --git a/README.md b/README.md
index d69f540..e4e9ca6 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,14 @@ go build -o gallery .
./gallery create <name> <password> [--data ./gallery-data] [--no-thumbs]
```
+### Delete a gallery
+
+```sh
+./gallery delete <name> [--data ./gallery-data]
+```
+
+Removes the gallery from the config and deletes its folder (photos + thumbnails). Asks for confirmation before deleting.
+
### Start the server
```sh
@@ -45,6 +53,3 @@ pics.example.com {
go test ./...
```
-## TODO
-
-- [ ] CLI command to cleanup a gallery: remove config and folder
diff --git a/gallery.go b/gallery.go
index 741964e..f0c0972 100644
--- a/gallery.go
+++ b/gallery.go
@@ -937,6 +937,37 @@ func (s *Server) createGalleryOpts(name, password string, thumbs bool) error {
}
// ---------------------------------------------------------------------------
+// CLI: delete gallery
+// ---------------------------------------------------------------------------
+
+func (s *Server) deleteGallery(name string) error {
+ if !validGalleryName.MatchString(name) {
+ return fmt.Errorf("invalid gallery name %q", name)
+ }
+
+ s.mu.Lock()
+ _, ok := s.galleries[name]
+ if !ok {
+ s.mu.Unlock()
+ return fmt.Errorf("gallery %q not found", name)
+ }
+ delete(s.galleries, name)
+ s.mu.Unlock()
+
+ if err := s.save(); err != nil {
+ return fmt.Errorf("failed to update config: %w", err)
+ }
+
+ dir := s.galleryDir(name)
+ if err := os.RemoveAll(dir); err != nil {
+ return fmt.Errorf("config removed but failed to delete directory %s: %w", dir, err)
+ }
+
+ log.Printf("Gallery %q deleted", name)
+ return nil
+}
+
+// ---------------------------------------------------------------------------
// Embedded templates & static assets
// ---------------------------------------------------------------------------
@@ -960,6 +991,7 @@ func printUsage() {
fmt.Fprintf(os.Stderr, `Usage:
gallery serve [--addr :8080] [--data ./data]
gallery create <name> <password> [--data ./data] [--no-thumbs]
+ gallery delete <name> [--data ./data]
Options:
--no-thumbs Disable thumbnail generation; serve source images in the grid.
@@ -968,6 +1000,7 @@ Examples:
gallery create crete-2026 "MySecret123" --data ./gallery-data
gallery create big-photos "pass" --data ./gallery-data --no-thumbs
gallery serve --addr :8080 --data ./gallery-data
+ gallery delete crete-2026 --data ./gallery-data
`)
}
@@ -1021,6 +1054,32 @@ func main() {
}
fmt.Printf("Gallery %q created in %s\n", name, filepath.Join(flags["data"], name))
+ case "delete":
+ if len(os.Args) < 3 {
+ fmt.Fprintln(os.Stderr, "Usage: gallery delete <name> [--data ./data]")
+ os.Exit(1)
+ }
+ name := os.Args[2]
+ flags := parseFlags(os.Args[3:], map[string]string{"data": "./data"})
+
+ srv := NewServer(flags["data"], 20<<20)
+ if err := srv.load(); err != nil {
+ log.Fatalf("Failed to load state: %v", err)
+ }
+
+ fmt.Printf("Delete gallery %q and all its photos from %s? [y/N] ", name, srv.galleryDir(name))
+ var answer string
+ fmt.Scanln(&answer)
+ if strings.ToLower(strings.TrimSpace(answer)) != "y" {
+ fmt.Println("Aborted.")
+ os.Exit(0)
+ }
+
+ if err := srv.deleteGallery(name); err != nil {
+ log.Fatalf("Failed to delete gallery: %v", err)
+ }
+ fmt.Printf("Gallery %q deleted.\n", name)
+
case "serve":
flags := parseFlags(os.Args[2:], map[string]string{
"addr": ":8080",