Skip to content

Commit

Permalink
modules: Improve "hugo mod clean"
Browse files Browse the repository at this point in the history
* Only clean project modules
* Optional glob pattern of module paths to clean

Closes #6907
  • Loading branch information
bep committed Feb 19, 2020
1 parent 0b96aba commit dce210a
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 22 deletions.
46 changes: 25 additions & 21 deletions commands/mod.go
Expand Up @@ -49,6 +49,30 @@ func (c *modCmd) newVerifyCmd() *cobra.Command {
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{}
Expand Down Expand Up @@ -215,27 +239,7 @@ If a module is vendored, that is where Hugo will look for it's dependencies.
})
},
},
&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)
Expand Down
3 changes: 2 additions & 1 deletion hugofs/fs.go
Expand Up @@ -15,6 +15,7 @@
package hugofs

import (
"fmt"
"os"
"strings"

Expand Down Expand Up @@ -97,7 +98,7 @@ func isWrite(flag int) bool {
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
Expand Down
35 changes: 35 additions & 0 deletions modules/client.go
Expand Up @@ -26,6 +26,9 @@ import (
"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"
Expand Down Expand Up @@ -339,6 +342,38 @@ func (c *Client) Verify(clean bool) error {
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
}

func (c *Client) runVerify() error {
return c.runGo(context.Background(), ioutil.Discard, "mod", "verify")
}
Expand Down

0 comments on commit dce210a

Please sign in to comment.