]> Cypherpunks.ru repositories - goredo.git/blobdiff - depfix.go
Less unnecessary Close()s
[goredo.git] / depfix.go
index 7ce7cb68b8d1cb9c3348b45dc1bf33d3036211f0..bf048798aad0a15c613deff75662ba3d54b9e193 100644 (file)
--- a/depfix.go
+++ b/depfix.go
@@ -18,8 +18,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package main
 
 import (
+       "bytes"
+       "encoding/hex"
        "errors"
        "io"
+       "io/fs"
        "os"
        "path"
        "strings"
@@ -31,7 +34,7 @@ func depFix(root string) error {
        tracef(CDebug, "depfix: entering %s", root)
        dir, err := os.Open(root)
        if err != nil {
-               return err
+               return ErrLine(err)
        }
        defer dir.Close()
        for {
@@ -40,7 +43,7 @@ func depFix(root string) error {
                        if err == io.EOF {
                                break
                        }
-                       return err
+                       return ErrLine(err)
                }
                for _, entry := range entries {
                        if entry.IsDir() {
@@ -55,10 +58,10 @@ func depFix(root string) error {
        redoDir := path.Join(root, RedoDir)
        dir, err = os.Open(redoDir)
        if err != nil {
-               if os.IsNotExist(err) {
+               if errors.Is(err, fs.ErrNotExist) {
                        return nil
                }
-               return err
+               return ErrLine(err)
        }
        defer dir.Close()
        redoDirChanged := false
@@ -68,7 +71,7 @@ func depFix(root string) error {
                        if err == io.EOF {
                                break
                        }
-                       return err
+                       return ErrLine(err)
                }
                for _, entry := range entries {
                        if !strings.HasSuffix(entry.Name(), DepSuffix) {
@@ -78,7 +81,7 @@ func depFix(root string) error {
                        fdDepPath := path.Join(redoDir, entry.Name())
                        fdDep, err := os.Open(fdDepPath)
                        if err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                        defer fdDep.Close()
                        r := recfile.NewReader(fdDep)
@@ -90,7 +93,7 @@ func depFix(root string) error {
                                        if errors.Is(err, io.EOF) {
                                                break
                                        }
-                                       return err
+                                       return ErrLine(err)
                                }
                                fieldses = append(fieldses, fields)
                                m := make(map[string]string, len(fields))
@@ -107,24 +110,24 @@ func depFix(root string) error {
                                tracef(CDebug, "depfix: checking %s/%s -> %s", root, entry.Name(), dep)
                                theirInode, err := inodeFromRec(m)
                                if err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
-                               theirHsh := m["Hash"]
+                               theirHsh := mustHexDecode(m["Hash"])
                                fd, err := os.Open(path.Join(root, dep))
                                if err != nil {
-                                       if os.IsNotExist(err) {
+                                       if errors.Is(err, fs.ErrNotExist) {
                                                tracef(
                                                        CDebug, "depfix: %s/%s -> %s: not exists",
                                                        root, entry.Name(), dep,
                                                )
                                                continue
                                        }
-                                       return err
+                                       return ErrLine(err)
                                }
-                               inode, err := inodeFromFileByFd(fd)
+                               inode, _, err := inodeFromFileByFd(fd)
                                if err != nil {
                                        fd.Close()
-                                       return err
+                                       return ErrLine(err)
                                }
                                if inode.Size != theirInode.Size {
                                        tracef(
@@ -145,9 +148,9 @@ func depFix(root string) error {
                                hsh, err := fileHash(fd)
                                fd.Close()
                                if err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
-                               if hsh != theirHsh {
+                               if !bytes.Equal(hsh, theirHsh) {
                                        tracef(
                                                CDebug, "depfix: %s/%s -> %s: hash differs",
                                                root, entry.Name(), dep,
@@ -157,7 +160,7 @@ func depFix(root string) error {
                                fields = []recfile.Field{
                                        {Name: "Type", Value: DepTypeIfchange},
                                        {Name: "Target", Value: dep},
-                                       {Name: "Hash", Value: hsh},
+                                       {Name: "Hash", Value: hex.EncodeToString(hsh)},
                                }
                                fields = append(fields, inode.RecfileFields()...)
                                fieldses[len(fieldses)-1] = fields
@@ -174,7 +177,7 @@ func depFix(root string) error {
                        redoDirChanged = true
                        fdDep, err = tempfile(redoDir, entry.Name())
                        if err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                        defer fdDep.Close()
                        tracef(
@@ -183,32 +186,32 @@ func depFix(root string) error {
                        )
                        w := recfile.NewWriter(fdDep)
                        if _, err := w.WriteFields(fieldses[0]...); err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                        fieldses = fieldses[1:]
                        for _, fields := range fieldses {
                                if _, err := w.RecordStart(); err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                                if _, err := w.WriteFields(fields...); err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                        }
                        if !NoSync {
                                if err = fdDep.Sync(); err != nil {
-                                       return err
+                                       return ErrLine(err)
                                }
                        }
                        fdDep.Close()
                        if err = os.Rename(fdDep.Name(), fdDepPath); err != nil {
-                               return err
+                               return ErrLine(err)
                        }
                        tracef(CRedo, "%s", fdDepPath)
                }
        }
        if redoDirChanged && !NoSync {
                if err = syncDir(redoDir); err != nil {
-                       return nil
+                       return err
                }
        }
        return nil