Skip to content

Commit

Permalink
commands: Add "hugo mod verify"
Browse files Browse the repository at this point in the history
See #6907
  • Loading branch information
bep committed Feb 19, 2020
1 parent fa520a2 commit 0b96aba
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 13 deletions.
16 changes: 3 additions & 13 deletions cache/filecache/filecache_pruner.go
Expand Up @@ -17,6 +17,8 @@ import (
"io"
"os"

"github.com/gohugoio/hugo/hugofs"

"github.com/pkg/errors"
"github.com/spf13/afero"
)
Expand Down Expand Up @@ -121,18 +123,6 @@ func (c *Cache) pruneRootDir(force bool) (int, error) {
return 0, nil
}

counter := 0
// Module cache has 0555 directories; make them writable in order to remove content.
afero.Walk(c.Fs, c.pruneAllRootDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return nil
}
if info.IsDir() {
counter++
c.Fs.Chmod(path, 0777)
}
return nil
})
return 1, c.Fs.RemoveAll(c.pruneAllRootDir)
return hugofs.MakeReadableAndRemoveAllModulePkgDir(c.Fs, c.pruneAllRootDir)

}
22 changes: 22 additions & 0 deletions commands/mod.go
Expand Up @@ -29,7 +29,28 @@ type modCmd struct {
*baseBuilderCmd
}

func (c *modCmd) newVerifyCmd() *cobra.Command {
var clean bool

verifyCmd := &cobra.Command{
Use: "verify",
Short: "Verify dependencies.",
Long: `Verify checks that the dependencies of the current module, which are stored in a local downloaded source cache, have not been modified since being downloaded.
`,
RunE: func(cmd *cobra.Command, args []string) error {
return c.withModsClient(true, func(c *modules.Client) error {
return c.Verify(clean)
})
},
}

verifyCmd.Flags().BoolVarP(&clean, "clean", "", false, "delete module cache for dependencies that fail verification")

return verifyCmd
}

func (b *commandsBuilder) newModCmd() *modCmd {

c := &modCmd{}

const commonUsage = `
Expand Down Expand Up @@ -184,6 +205,7 @@ If a module is vendored, that is where Hugo will look for it's dependencies.
})
},
},
c.newVerifyCmd(),
&cobra.Command{
Use: "tidy",
Short: "Remove unused entries in go.mod and go.sum.",
Expand Down
25 changes: 25 additions & 0 deletions hugofs/fs.go
Expand Up @@ -16,6 +16,7 @@ package hugofs

import (
"os"
"strings"

"github.com/gohugoio/hugo/config"
"github.com/spf13/afero"
Expand Down Expand Up @@ -88,3 +89,27 @@ func getWorkingDirFs(base afero.Fs, cfg config.Provider) *afero.BasePathFs {
func isWrite(flag int) bool {
return flag&os.O_RDWR != 0 || flag&os.O_WRONLY != 0
}

// MakeReadableAndRemoveAllModulePkgDir makes any subdir in dir readable and then
// removes the root.
// TODO(bep) move this to a more suitable place.
//
func MakeReadableAndRemoveAllModulePkgDir(fs afero.Fs, dir string) (int, error) {
// Safe guard
if !strings.Contains(dir, "pkg") {
panic("invalid dir")
}

counter := 0
afero.Walk(fs, dir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return nil
}
if info.IsDir() {
counter++
fs.Chmod(path, 0777)
}
return nil
})
return counter, fs.RemoveAll(dir)
}
35 changes: 35 additions & 0 deletions modules/client.go
Expand Up @@ -24,6 +24,9 @@ import (
"os"
"os/exec"
"path/filepath"
"regexp"

"github.com/gohugoio/hugo/hugofs"

"github.com/gohugoio/hugo/hugofs/files"

Expand Down Expand Up @@ -308,6 +311,38 @@ func (c *Client) Init(path string) error {
return nil
}

var verifyErrorDirRe = regexp.MustCompile(`dir has been modified \((.*?)\)`)

// Verify checks that the dependencies of the current module,
// which are stored in a local downloaded source cache, have not been
// modified since being downloaded.
func (c *Client) Verify(clean bool) error {
// TODO1 add path to mod clean
err := c.runVerify()

if err != nil {
if clean {
m := verifyErrorDirRe.FindAllStringSubmatch(err.Error(), -1)
if m != nil {
for i := 0; i < len(m); i++ {
c, err := hugofs.MakeReadableAndRemoveAllModulePkgDir(c.fs, m[i][1])
if err != nil {
return err
}
fmt.Println("Cleaned", c)
}
}
// Try to verify it again.
err = c.runVerify()
}
}
return err
}

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

func isProbablyModule(path string) bool {
return module.CheckPath(path) == nil
}
Expand Down

0 comments on commit 0b96aba

Please sign in to comment.