modules/npm: Preserve the original package.json if it exists
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 14 Sep 2020 15:09:34 +0000 (17:09 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 14 Sep 2020 23:04:31 +0000 (01:04 +0200)
Fixes #7690

common/hugio/copy.go
hugolib/hugo_modules_test.go
modules/npm/package_builder.go

index 2b756cb44285a6b699d4f9b6381c00b993af383d..be4506f4cd192044cf8b48e52ee37ffcc5e04908 100644 (file)
@@ -26,28 +26,29 @@ import (
 
 // CopyFile copies a file.
 func CopyFile(fs afero.Fs, from, to string) error {
-       sf, err := os.Open(from)
+       sf, err := fs.Open(from)
        if err != nil {
                return err
        }
        defer sf.Close()
-       df, err := os.Create(to)
+       df, err := fs.Create(to)
        if err != nil {
                return err
        }
        defer df.Close()
        _, err = io.Copy(df, sf)
-       if err == nil {
-               si, err := os.Stat(from)
-               if err != nil {
-                       err = os.Chmod(to, si.Mode())
+       if err != nil {
+               return err
+       }
+       si, err := fs.Stat(from)
+       if err != nil {
+               err = fs.Chmod(to, si.Mode())
 
-                       if err != nil {
-                               return err
-                       }
+               if err != nil {
+                       return err
                }
-
        }
+
        return nil
 }
 
index c3358a0c252f98913ea1ee32be5b561bdcf46cea..87cddf0864035d2ffeb9b10ada09c7080df8b52f 100644 (file)
@@ -201,14 +201,16 @@ JS imported in module: |
                b, clean := newTestBuilder(t, "")
                defer clean()
 
-               b.WithSourceFile("package.json", `{
+               const origPackageJSON = `{
                "name": "mypack",
                "version": "1.2.3",
         "scripts": {},
           "dependencies": {
            "moo": "1.2.3"
                }
-}`)
+}`
+
+               b.WithSourceFile("package.json", origPackageJSON)
 
                b.Build(BuildCfg{})
                b.Assert(npm.Pack(b.H.BaseFs.SourceFs, b.H.BaseFs.Assets.Dirs), qt.IsNil)
@@ -244,6 +246,10 @@ JS imported in module: |
  "version": "1.2.3"
 }`
                })
+
+               // https://github.com/gohugoio/hugo/issues/7690
+               b.AssertFileContent("package.hugo.json", origPackageJSON)
+
        })
 
        t.Run("Create package.json, no default, no package.json", func(t *testing.T) {
@@ -281,7 +287,9 @@ JS imported in module: |
  "name": "myhugosite",
  "version": "0.1.0"
 }`
+
                })
+
        })
 
 }
index 23aac7246379150316854cc55a4c50d43bb6ce77..c0a5b0dad54b2152e469e7a2173371ec8231f3dd 100644 (file)
@@ -18,6 +18,8 @@ import (
        "fmt"
        "io"
 
+       "github.com/gohugoio/hugo/common/hugio"
+
        "github.com/gohugoio/hugo/hugofs/files"
 
        "github.com/pkg/errors"
@@ -51,7 +53,12 @@ func Pack(fs afero.Fs, fis []hugofs.FileMetaInfo) error {
        if err != nil {
                // Have a package.json?
                fi, err = fs.Stat(packageJSONName)
-               if err != nil {
+               if err == nil {
+                       // Preserve the original in package.hugo.json.
+                       if err = hugio.CopyFile(fs, packageJSONName, files.FilenamePackageHugoJSON); err != nil {
+                               return errors.Wrap(err, "npm pack: failed to copy package file")
+                       }
+               } else {
                        // Create one.
                        name := "project"
                        // Use the Hugo site's folder name as the default name.