Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Intermediate merge of branch Dev #18

Merged
merged 50 commits into from
Sep 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
3438da3
squashed WIP
soerenkoehler Feb 25, 2022
b76c7ff
comparator tests WIP
soerenkoehler Feb 25, 2022
190372f
simplification: no more quick diff by size or time
soerenkoehler Feb 25, 2022
59a50f0
small cleanups
soerenkoehler Feb 26, 2022
1ac7c58
refactoring WIP
soerenkoehler Mar 5, 2022
825e901
refactor tests WIP
soerenkoehler Mar 5, 2022
0a8fa40
upgrade kong
soerenkoehler Mar 7, 2022
effec5c
merge
soerenkoehler Mar 12, 2022
4cd729c
WIP
soerenkoehler Mar 22, 2022
f01c4b4
refactoring
soerenkoehler Apr 9, 2022
8e605df
security policy
soerenkoehler Jun 7, 2022
39dd9c6
upgrade dependencies
soerenkoehler Jun 21, 2022
52f4161
activate testutils for server build
soerenkoehler Jun 21, 2022
fd08f31
fix file tests (wip)
soerenkoehler Jun 21, 2022
36fe20b
improve tests
soerenkoehler Aug 5, 2022
85736e2
test load and save (wip)
soerenkoehler Aug 17, 2022
48bd40c
test load and save (wip)
soerenkoehler Aug 23, 2022
2222e86
refactoring (wip)
soerenkoehler Sep 2, 2022
914f42c
refactoring (wip)
soerenkoehler Sep 2, 2022
5288f26
refactoring and fixing tests (wip)
soerenkoehler Sep 6, 2022
91d7672
updating lib versions
soerenkoehler Jul 1, 2023
dee413f
update go.sum
soerenkoehler Jul 1, 2023
abf891f
update workflowfile
soerenkoehler Jul 1, 2023
e5bbbf6
switch to strftime library
soerenkoehler Jul 16, 2023
03edf3c
fix test
soerenkoehler Jul 16, 2023
7c5d41d
fix tests
soerenkoehler Aug 4, 2023
1743161
improve tests
soerenkoehler Aug 4, 2023
c32a9aa
migrate to testify
soerenkoehler Aug 8, 2023
ab20e7c
improve tests
soerenkoehler Feb 6, 2024
3457c7c
fix build.yml
soerenkoehler Feb 6, 2024
b23623d
more use of testify/suite
soerenkoehler Feb 6, 2024
8c636bc
improve error handling
soerenkoehler Feb 7, 2024
afcee3c
path filter (wip)
soerenkoehler Feb 7, 2024
01abd61
refactor test suites
soerenkoehler Feb 10, 2024
091ebb2
logging
soerenkoehler Feb 10, 2024
db9f241
config file
soerenkoehler Feb 10, 2024
a8b3088
refactoring path filter
soerenkoehler Feb 10, 2024
d9f5f54
fix tests and error handling
soerenkoehler Feb 10, 2024
bf00382
config file & tests
soerenkoehler Feb 11, 2024
182d46c
fix & improve tests
soerenkoehler Feb 11, 2024
c7fe92d
refavctor tests
soerenkoehler Feb 11, 2024
c69fad9
error handling
soerenkoehler Feb 11, 2024
1a36b82
config loading
soerenkoehler Feb 11, 2024
176d463
wip: error handling vs. coverage
soerenkoehler Feb 26, 2024
1ef2804
error handling & test coverage
soerenkoehler Apr 1, 2024
9df53ce
fix github action
soerenkoehler Apr 1, 2024
95cfc6f
update go.mod
soerenkoehler Sep 8, 2024
6006bbf
update go.mod
soerenkoehler Sep 8, 2024
8eeec07
.gitignore coverage files
soerenkoehler Sep 8, 2024
7a0b5bb
update go version in pipeline
soerenkoehler Sep 8, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/go-util-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
- name: Setup Go environment
uses: actions/[email protected]
with:
go-version: "1.20"
go-version: "1.23"

- name: Checkout
uses: actions/[email protected]
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
*.out
coverage.*
__debug_bin
**/artifacts
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
Notes & External Docs
---------------------

### Libraries ###

* [CLI Parser Kong](https://github.com/alecthomas/kong#readme)

### Cross Compiling ###

* [Go Architecture Matrix](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63)
Expand Down
19 changes: 19 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Security Policy

## Supported Versions

| Version | Supported |
| --------- | ------------------ |
| tbd | :white_check_mark: |
| < tbd | :x: |
| latest | :x: |

## Reporting a Vulnerability

To report any vulnerability or bugs open an issue at:

https://github.com/soerenkoehler/go-chdiff/issues

Resource considerations: Real life will always out-prioritise non-commercial
open source hobby projects. So don't expect 24/7 support with 30min response
time.
158 changes: 126 additions & 32 deletions chdiff/chdiff.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,61 +2,155 @@ package chdiff

import (
_ "embed"
"log"
"encoding/json"
"io"
"os"
"path"
"path/filepath"

"github.com/alecthomas/kong"
"github.com/soerenkoehler/chdiff-go/digest"
"github.com/soerenkoehler/chdiff-go/util"
"github.com/soerenkoehler/go-chdiff/common"
"github.com/soerenkoehler/go-chdiff/diff"
"github.com/soerenkoehler/go-chdiff/digest"
"github.com/soerenkoehler/go-chdiff/util"
)

//go:embed description.txt
var _Description string
const (
DefaultDigestName string = ".chdiff.txt"
UserConfigFileName string = ".chdiff-config.json"
)

var cli struct {
Create cmdDigest `cmd:"" name:"create" aliases:"c" help:"Create digest file for PATH."`
Verify cmdDigest `cmd:"" name:"verify" aliases:"v" default:"1" help:"Verify digest file for PATH."`
}
var (
//go:embed description.txt
_description string

//go:embed default-config.json
_defaultConfigJson []byte
)

type cmdDigest struct {
Path string `arg:"" name:"PATH" type:"path" default:"." help:"Path for which to calculate the digest"`
Algorithm string `name:"alg" help:"The checksum algorithm to use [SHA256,SHA512]." enum:"SHA256,SHA512" default:"SHA256"`
RootPath string `arg:"" name:"PATH" type:"path" default:"." help:"Path for which to calculate the digest"`
DigestFile string `name:"file" short:"f" help:"Optional: Path to different location of the digest file."`
}

func DoMain(
type CmdCreate struct {
cmdDigest
Algorithm string `name:"algorithm" short:"a" help:"The checksum algorithm to use [SHA256,SHA512]." enum:"SHA256,SHA512" default:"SHA256"`
}

type CmdVerify struct{ cmdDigest }

type ChdiffDependencies interface {
DigestRead(string, string) (digest.Digest, error)
DigestWrite(digest.Digest, string) error
DigestCalculate(string, digest.HashType) digest.Digest
DigestCompare(digest.Digest, digest.Digest) diff.Diff
DiffPrint(io.Writer, diff.Diff)
Stdout() io.Writer
Stderr() io.Writer
KongExit() func(int)
}

func Chdiff(
version string,
args []string,
digestService digest.Service,
stdioService util.StdIOService) {
deps ChdiffDependencies) {

os.Args = args
log.SetOutput(stdioService.Stdout())
util.InitLogger(deps.Stderr())

loadConfig()

var cli struct {
Create CmdCreate `cmd:"" name:"create" aliases:"c" help:"Create digest file for PATH."`
Verify CmdVerify `cmd:"" name:"verify" aliases:"v" help:"Verify digest file for PATH."`
}

ctx := kong.Parse(
&cli,
kong.Vars{"VERSION": version},
kong.Description(_Description),
kong.Description(_description),
kong.UsageOnError(),
kong.Writers(
stdioService.Stdout(),
stdioService.Stderr()))
kong.Writers(deps.Stdout(), deps.Stderr()),
kong.Exit(deps.KongExit()),
kong.BindTo(deps, (*ChdiffDependencies)(nil)))

switch ctx.Command() {
if ctx != nil {
ctx.FatalIfErrorf(ctx.Run(deps))
}
}

case "create", "create <PATH>":
digestService.Create(
cli.Create.Path,
path.Join(cli.Create.Path, "out.txt"),
cli.Create.Algorithm)
func (cmd *CmdCreate) Run(deps ChdiffDependencies) error {
return deps.DigestWrite(
deps.DigestCalculate(
cmd.RootPath,
hashTypeFromAlgorithm(cmd.Algorithm)),
defaultDigestFile(cmd.cmdDigest))
}

case "verify", "verify <PATH>":
digestService.Verify(
cli.Verify.Path,
path.Join(cli.Verify.Path, "out.txt"),
cli.Verify.Algorithm)
func (cmd *CmdVerify) Run(deps ChdiffDependencies) error {
var chain util.ChainContext
var oldDigest digest.Digest

chain.Chain(func() {
oldDigest, chain.Err = deps.DigestRead(
cmd.RootPath,
defaultDigestFile(cmd.cmdDigest))
}).Chain(func() {
deps.DiffPrint(
deps.Stdout(),
deps.DigestCompare(
oldDigest,
deps.DigestCalculate(
cmd.RootPath,
oldDigest.Algorithm)))
}).ChainError("verify")

return chain.Err
}

func loadConfig() {
chain := &util.ChainContext{}
chain.Chain(func() {
chain.Err = json.Unmarshal(readConfigFile(), &common.Config)
}).Chain(func() {
util.SetLogLevelByName(common.Config.LogLevel)
util.Debug("%+v", common.Config)
}).ChainFatal("reading config")
}

func readConfigFile() []byte {
userhome, err := os.UserHomeDir()
if err != nil {
util.Warn("can't determine user home")
return _defaultConfigJson
}

configFile := filepath.Join(userhome, UserConfigFileName)
data, err := os.ReadFile(configFile)
if err != nil {
os.WriteFile(configFile, _defaultConfigJson, 0744)
return _defaultConfigJson
}

return data
}

func hashTypeFromAlgorithm(algorithm string) digest.HashType {
switch algorithm {
case "SHA512":
return digest.SHA512
case "SHA256":
fallthrough
default:
log.Fatalf("unknown command: %s", ctx.Command())
return digest.SHA256
}
}

func defaultDigestFile(cmd cmdDigest) string {
digestFile := cmd.DigestFile
if len(cmd.DigestFile) == 0 {
digestFile = filepath.Join(cmd.RootPath, DefaultDigestName)
}
absPath, _ := filepath.Abs(digestFile)
return absPath
}
Loading
Loading