shithub: hugo

Download patch

ref: dce210ab56fc885818fc5d1a084a1c3ba84e7929
parent: 0b96aba022d51cf9939605c029bb8dba806653a1
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Wed Feb 19 11:59:54 EST 2020

modules: Improve "hugo mod clean"

* Only clean project modules
* Optional glob pattern of module paths to clean

Closes #6907

--- a/commands/mod.go
+++ b/commands/mod.go
@@ -49,6 +49,30 @@
 	return verifyCmd
 }
 
+func (c *modCmd) newCleanCmd() *cobra.Command {
+	var pattern string
+	cmd := &cobra.Command{
+		Use:   "clean",
+		Short: "Delete the Hugo Module cache for the current project.",
+		Long: `Delete the Hugo Module cache for the current project.
+
+Note that after you run this command, all of your dependencies will be re-downloaded next time you run "hugo".
+
+Also note that if you configure a positive maxAge for the "modules" file cache, it will also be cleaned as part of "hugo --gc".
+ 
+`,
+		RunE: func(cmd *cobra.Command, args []string) error {
+			return c.withModsClient(true, func(c *modules.Client) error {
+				return c.Clean(pattern)
+			})
+		},
+	}
+
+	cmd.Flags().StringVarP(&pattern, "pattern", "", "", `pattern matching module paths to clean (all if not set), e.g. "**hugo*"`)
+
+	return cmd
+}
+
 func (b *commandsBuilder) newModCmd() *modCmd {
 
 	c := &modCmd{}
@@ -215,27 +239,7 @@
 				})
 			},
 		},
-		&cobra.Command{
-			Use:   "clean",
-			Short: "Delete the entire Hugo Module cache.",
-			Long: `Delete the entire Hugo Module cache.
-
-Note that after you run this command, all of your dependencies will be re-downloaded next time you run "hugo".
-
-Also note that if you configure a positive maxAge for the "modules" file cache, it will also be cleaned as part of "hugo --gc".
- 
-`,
-			RunE: func(cmd *cobra.Command, args []string) error {
-				com, err := c.initConfig(true)
-				if err != nil {
-					return err
-				}
-
-				_, err = com.hugo().FileCaches.ModulesCache().Prune(true)
-				return err
-
-			},
-		},
+		c.newCleanCmd(),
 	)
 
 	c.baseBuilderCmd = b.newBuilderCmd(cmd)
--- a/hugofs/fs.go
+++ b/hugofs/fs.go
@@ -15,6 +15,7 @@
 package hugofs
 
 import (
+	"fmt"
 	"os"
 	"strings"
 
@@ -97,7 +98,7 @@
 func MakeReadableAndRemoveAllModulePkgDir(fs afero.Fs, dir string) (int, error) {
 	// Safe guard
 	if !strings.Contains(dir, "pkg") {
-		panic("invalid dir")
+		panic(fmt.Sprint("invalid dir:", dir))
 	}
 
 	counter := 0
--- a/modules/client.go
+++ b/modules/client.go
@@ -26,6 +26,9 @@
 	"path/filepath"
 	"regexp"
 
+	"github.com/gobwas/glob"
+	hglob "github.com/gohugoio/hugo/hugofs/glob"
+
 	"github.com/gohugoio/hugo/hugofs"
 
 	"github.com/gohugoio/hugo/hugofs/files"
@@ -334,6 +337,38 @@
 			}
 			// Try to verify it again.
 			err = c.runVerify()
+		}
+	}
+	return err
+}
+
+func (c *Client) Clean(pattern string) error {
+	mods, err := c.listGoMods()
+	if err != nil {
+		return err
+	}
+
+	var g glob.Glob
+
+	if pattern != "" {
+		var err error
+		g, err = hglob.GetGlob(pattern)
+		if err != nil {
+			return err
+		}
+	}
+
+	for _, m := range mods {
+		if m.Replace != nil || m.Main {
+			continue
+		}
+
+		if g != nil && !g.Match(m.Path) {
+			continue
+		}
+		_, err = hugofs.MakeReadableAndRemoveAllModulePkgDir(c.fs, m.Dir)
+		if err == nil {
+			c.logger.FEEDBACK.Printf("hugo: cleaned module cache for %q", m.Path)
 		}
 	}
 	return err