Skip to content

Commit

Permalink
fix: hashing file at head
Browse files Browse the repository at this point in the history
- properly handle error when file couldn't be decrypted
- include SHA256 hashes in logs for further diagnosis
  • Loading branch information
pskrwe committed Feb 9, 2024
1 parent 8ebeb80 commit 74132d9
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 10 deletions.
21 changes: 16 additions & 5 deletions handlers/cli/clean.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,17 @@ package cli
import (
"bufio"
"bytes"
"encoding/hex"
"errors"
"fmt"
"io"
"log/slog"
"os"

"github.com/go-git/go-git/v5/plumbing"

"github.com/prskr/git-age/internal/fsx"

"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
"github.com/prskr/git-age/core/ports"
"github.com/prskr/git-age/core/services"
Expand Down Expand Up @@ -54,22 +56,31 @@ func (h *CleanCliHandler) CleanFile(ctx *cli.Context) error {

logger.Info("Hashing file at HEAD")
obj, headHash, err := h.hashFileAtHead(fileToCleanPath, true)
if errors.Is(err, plumbing.ErrObjectNotFound) {
logger.Info("File not found at HEAD, file is apparently new")
return h.copyEncryptedFileToStdout(fileToClean)
if err != nil {
if errors.Is(err, plumbing.ErrObjectNotFound) {
logger.Info("File not found at HEAD, file is apparently new")
return h.copyEncryptedFileToStdout(fileToClean)
}

return fmt.Errorf("failed to hash file at HEAD: %w", err)
}

logger = logger.With(slog.String("orig_hash", hex.EncodeToString(headHash)))

logger.Info("Hashing file at current state to determine whether it has changed")
currentHash, err := h.hashFileAt(fileToClean)
if err != nil {
return err
}

logger = logger.With(slog.String("current_hash", hex.EncodeToString(currentHash)))

if bytes.Equal(headHash, currentHash) {
logger.Info("File has not changed, returning original")
return h.copyGitObjectToStdout(obj)
}

logger.Info("File has changed since last commit")
return h.copyEncryptedFileToStdout(fileToClean)
}

Expand Down Expand Up @@ -166,7 +177,7 @@ func (h *CleanCliHandler) hashFileAtHead(
slog.String("path", path),
slog.String("err", err.Error()),
)
} else if r, err := h.OpenSealer.OpenFile(fileObjReader); err != nil {
} else if r, err := h.OpenSealer.OpenFile(bufReader); err != nil {
return nil, nil, err
} else {
reader = r
Expand Down
2 changes: 1 addition & 1 deletion handlers/cli/files.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func (h *FilesCliHandler) TrackFiles(ctx *cli.Context) (err error) {
err = errors.Join(err, attributesFile.Close())
}()

attributesLine := fmt.Sprintf("%s filter=age diff=age merge=age -text\n", ctx.Args().First())
attributesLine := ctx.Args().First() + " filter=age diff=age merge=age -text\n"
if _, err := attributesFile.WriteString(attributesLine); err != nil {
return fmt.Errorf("failed to write to .gitattributes file: %w", err)
}
Expand Down
4 changes: 3 additions & 1 deletion handlers/cli/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ func copyToTemp(reader io.Reader) (f *os.File, err error) {
}

defer func() {
_, err = f.Seek(0, io.SeekStart)
if err == nil {
_, err = f.Seek(0, io.SeekStart)
}
}()

defer func() {
Expand Down
3 changes: 1 addition & 2 deletions infrastructure/fs.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package infrastructure

import (
"fmt"
"io/fs"
"os"
"path/filepath"
Expand Down Expand Up @@ -79,7 +78,7 @@ func (r readWriteOsFile) Name() string {
var err error
name, err = filepath.Rel(r.fsRoot, name)
if err != nil {
panic(fmt.Sprintf("failed to get relative path: %s", err.Error()))
panic("failed to get relative path: " + err.Error())
}

return filepath.ToSlash(name)
Expand Down
2 changes: 1 addition & 1 deletion infrastructure/identities.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func (i Identities) Generate(comment string) (pubKey string, err error) {
}()

if comment == "" {
comment = fmt.Sprintf("# generated on %s", time.Now().Format(time.RFC3339))
comment = "# generated on " + time.Now().Format(time.RFC3339)
}

scanner := bufio.NewScanner(strings.NewReader(comment))
Expand Down

0 comments on commit 74132d9

Please sign in to comment.