diff --git a/kpm.go b/kpm.go index fbafb996..46227da4 100644 --- a/kpm.go +++ b/kpm.go @@ -3,6 +3,7 @@ package main import ( + "fmt" "os" "github.com/urfave/cli/v2" @@ -16,7 +17,7 @@ func main() { reporter.InitReporter() kpmcli, err := client.NewKpmClient() if err != nil { - reporter.Fatal(err) + kpmcli.WriteLog(fmt.Sprintf("Error: %v", err)) } app := cli.NewApp() app.Name = "kpm" diff --git a/pkg/checker/scripts/registry_auth/htpasswd b/pkg/checker/scripts/registry_auth/htpasswd new file mode 100644 index 00000000..e69de29b diff --git a/pkg/client/client.go b/pkg/client/client.go index 9f64c494..421072a1 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1,9 +1,11 @@ package client import ( + "fmt" "io" "os" "path/filepath" + "strings" remoteauth "oras.land/oras-go/v2/registry/remote/auth" @@ -11,6 +13,7 @@ import ( "kcl-lang.io/kpm/pkg/constants" "kcl-lang.io/kpm/pkg/downloader" "kcl-lang.io/kpm/pkg/env" + "kcl-lang.io/kpm/pkg/logger" pkg "kcl-lang.io/kpm/pkg/package" "kcl-lang.io/kpm/pkg/reporter" "kcl-lang.io/kpm/pkg/settings" @@ -57,7 +60,7 @@ func NewKpmClient() (*KpmClient, error) { ) return &KpmClient{ - logWriter: os.Stdout, + logWriter: logger.NewLogWriter(), settings: *settings, homePath: homePath, ModChecker: ModChecker, @@ -65,6 +68,15 @@ func NewKpmClient() (*KpmClient, error) { }, nil } +// WriteLog writes a log message +func (c *KpmClient) WriteLog(message string) { + if strings.Contains(message, "[FATAL]") { + fmt.Fprintln(c.logWriter, message) + os.Exit(1) // Exit the program + } + c.logWriter.Write([]byte(message + "\n")) +} + // SetInsecureSkipTLSverify will set the flag of whether to skip the verification of TLS. func (c *KpmClient) SetInsecureSkipTLSverify(insecureSkipTLSverify bool) { c.insecureSkipTLSverify = insecureSkipTLSverify diff --git a/pkg/client/test_data/issues/github.com/kcl-lang/kcl/issues/1760/a/kcl.mod.lock b/pkg/client/test_data/issues/github.com/kcl-lang/kcl/issues/1760/a/kcl.mod.lock index 252a3083..6a6d847e 100644 --- a/pkg/client/test_data/issues/github.com/kcl-lang/kcl/issues/1760/a/kcl.mod.lock +++ b/pkg/client/test_data/issues/github.com/kcl-lang/kcl/issues/1760/a/kcl.mod.lock @@ -19,3 +19,11 @@ reg = "ghcr.io" repo = "kcl-lang/fluxcd-source-controller" oci_tag = "v1.3.2" + [dependencies.k8s] + name = "k8s" + full_name = "k8s_1.31.2" + version = "1.31.2" + sum = "xBZgPsnpVVyWBpahuPQHReeRx28eUHGFoaPeqbct+vs=" + reg = "ghcr.io" + repo = "kcl-lang/k8s" + oci_tag = "1.31.2" diff --git a/pkg/client/test_data/resolve_metadata/with_package/kcl.mod.lock b/pkg/client/test_data/resolve_metadata/with_package/kcl.mod.lock index 32355765..2d3841c0 100644 --- a/pkg/client/test_data/resolve_metadata/with_package/kcl.mod.lock +++ b/pkg/client/test_data/resolve_metadata/with_package/kcl.mod.lock @@ -1,7 +1,7 @@ [dependencies] [dependencies.cc] name = "cc" - full_name = "flask-demo-kcl-manifests_8308200" + full_name = "cc_0.0.1" version = "0.0.1" url = "https://github.com/kcl-lang/flask-demo-kcl-manifests.git" commit = "8308200" diff --git a/pkg/client/test_data/test_dep_order/kcl.mod.lock b/pkg/client/test_data/test_dep_order/kcl.mod.lock index c7247002..fac2726b 100644 --- a/pkg/client/test_data/test_dep_order/kcl.mod.lock +++ b/pkg/client/test_data/test_dep_order/kcl.mod.lock @@ -3,6 +3,7 @@ name = "helloworld" full_name = "helloworld_0.1.2" version = "0.1.2" + sum = "PN0OMEV9M8VGFn1CtA/T3bcgZmMJmOo+RkBrLKIWYeQ=" reg = "ghcr.io" repo = "kcl-lang/helloworld" oci_tag = "0.1.2" @@ -10,6 +11,7 @@ name = "jsonpatch" full_name = "jsonpatch_0.0.5" version = "0.0.5" + sum = "HFrflv3tfgcx+CkCj4Pl7EIXjr+SKH8c+hRI4/A3ThA=" reg = "ghcr.io" repo = "kcl-lang/jsonpatch" oci_tag = "0.0.5" diff --git a/pkg/client/test_data/test_mod_file_package/test_pkg/kcl.mod b/pkg/client/test_data/test_mod_file_package/test_pkg/kcl.mod deleted file mode 100644 index 921ea2db..00000000 --- a/pkg/client/test_data/test_mod_file_package/test_pkg/kcl.mod +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "test_pkg" -edition = "v0.11.0" -version = "0.0.1" - -[dependencies] -cc = { git = "https://github.com/kcl-lang/flask-demo-kcl-manifests.git", commit = "8308200", package = "cc" } diff --git a/pkg/client/test_data/test_mod_file_package/test_pkg/kcl.mod.lock b/pkg/client/test_data/test_mod_file_package/test_pkg/kcl.mod.lock deleted file mode 100644 index 32355765..00000000 --- a/pkg/client/test_data/test_mod_file_package/test_pkg/kcl.mod.lock +++ /dev/null @@ -1,8 +0,0 @@ -[dependencies] - [dependencies.cc] - name = "cc" - full_name = "flask-demo-kcl-manifests_8308200" - version = "0.0.1" - url = "https://github.com/kcl-lang/flask-demo-kcl-manifests.git" - commit = "8308200" - package = "cc" diff --git a/pkg/event/event.go b/pkg/event/event.go new file mode 100644 index 00000000..496512ad --- /dev/null +++ b/pkg/event/event.go @@ -0,0 +1,18 @@ +package event + +import "kcl-lang.io/kpm/pkg/client" + +// KpmEvent handles diagnostic events. +type KpmEvent struct { + client *client.KpmClient +} + +// NewKpmEvent creates a new KpmEvent. +func NewKpmEvent(client *client.KpmClient) *KpmEvent { + return &KpmEvent{client: client} +} + +// Log writes a diagnostic message. +func (e *KpmEvent) Log(message string) { + e.client.WriteLog(message) +} diff --git a/pkg/logger/logwriter.go b/pkg/logger/logwriter.go new file mode 100644 index 00000000..f96f4d8b --- /dev/null +++ b/pkg/logger/logwriter.go @@ -0,0 +1,38 @@ +package logger + +import ( + "fmt" + "os" +) + +// LogWriter is a custom log writer with log level control. +type LogWriter struct { + Level LogLevel +} + +// LogLevel represents the log level. +type LogLevel string + +const ( + InfoLevel LogLevel = "info" + DebugLevel LogLevel = "debug" +) + +// NewLogWriter creates a new LogWriter with the given level. +func NewLogWriter() *LogWriter { + level := os.Getenv("KPM_LOG_LEVEL") + if level == "" { + level = string(InfoLevel) + } + return &LogWriter{Level: LogLevel(level)} +} + +// Write implements the io.Writer interface. +func (lw *LogWriter) Write(p []byte) (n int, err error) { + if lw.Level == DebugLevel { + fmt.Fprintf(os.Stdout, "[DEBUG] %s", string(p)) + } else { + fmt.Fprintf(os.Stdout, "[INFO] %s", string(p)) + } + return len(p), nil +} diff --git a/pkg/logger/logwriter_test.go b/pkg/logger/logwriter_test.go new file mode 100644 index 00000000..96c08b5b --- /dev/null +++ b/pkg/logger/logwriter_test.go @@ -0,0 +1,28 @@ +package logger + +import ( + "os" + "testing" +) + +func TestLogWriterInfo(t *testing.T) { + os.Setenv("KPM_LOG_LEVEL", "info") + writer := NewLogWriter() + + message := "Test Info Message" + n, err := writer.Write([]byte(message)) + if err != nil || n != len(message) { + t.Errorf("expected %d bytes written, got %d, error: %v", len(message), n, err) + } +} + +func TestLogWriterDebug(t *testing.T) { + os.Setenv("KPM_LOG_LEVEL", "debug") + writer := NewLogWriter() + + message := "Test Debug Message" + n, err := writer.Write([]byte(message)) + if err != nil || n != len(message) { + t.Errorf("expected %d bytes written, got %d, error: %v", len(message), n, err) + } +}