diff --git a/README.md b/README.md index 701a1d6..ac6853d 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,12 @@ If you want to ignore certain paths, you can use `-i/--ignore`: It supports a list of patterns in a comma separated list, wildcards work, more [on pkg.go.dev]. -If you run into issues, run with `-d/--debug` to see what is happening under the hood. +If you run into issues, run with `-d/--debug`. All debug logs are stored in a time stamped log file under `/tmp/`. + +```bash +➜ ls /tmp/ | grep -i distribusi +distribusi-go-20-25-492637114356 +``` :v: diff --git a/distribusi.go b/distribusi.go index 6b01db5..d381ba2 100644 --- a/distribusi.go +++ b/distribusi.go @@ -8,6 +8,7 @@ import ( "encoding/base64" "fmt" "image/png" + "io" "io/fs" "io/ioutil" "net/http" @@ -17,6 +18,7 @@ import ( "path/filepath" "sort" "strings" + "time" logrusStack "github.com/Gurpartap/logrus-stack" "github.com/barasher/go-exiftool" @@ -178,7 +180,19 @@ Example: if c.Bool("debug") { logrus.SetLevel(logrus.DebugLevel) logrus.SetFormatter(&logrus.TextFormatter{}) - logrus.SetOutput(os.Stderr) + + logFile, err := getLogFile() + if err != nil { + logrus.Fatalf("unable to set up a log file, saw: %s", err) + } + + logrus.SetOutput(io.MultiWriter(os.Stderr, logFile)) + logrus.RegisterExitHandler(func() { + if logFile == nil { + return + } + logFile.Close() + }) logrus.AddHook(logrusStack.StandardHook()) } @@ -190,6 +204,8 @@ Example: logrus.Fatal(err) } + logrus.Debugf("selecting %s as distribusi root", root) + var ignore []string if c.String("ignore") != "" { ignore = strings.Split(c.String("ignore"), ",") @@ -217,21 +233,25 @@ Example: exiftoolInstalled = false } - logrus.Debugf("selecting %s as distribusi root", root) - ch := make(chan error, 2) go func() { + logrus.Debug("distribuis commencing generation...") + if err := distribusify(c, root, ignore); err != nil { ch <- err return } + logrus.Debug("distribusi finished generation!") + ch <- nil return }() if c.Bool("serve") { go func() { + logrus.Debug("starting up web server") + if err := serveHTTP(root); err != nil { ch <- err return @@ -283,7 +303,8 @@ func distribusify(c *cli.Context, root string, ignore []string) error { absPath, err := filepath.Abs(fpath) if err != nil { - return err + logrus.Debugf("unable to read %s", absPath) + return nil } contents, err := ioutil.ReadDir(absPath) @@ -297,15 +318,19 @@ func distribusify(c *cli.Context, root string, ignore []string) error { dirs = append(dirs, path.Join(absPath, content.Name())) } else { if content.Name() == "index.html" { - file, err := os.ReadFile(path.Join(absPath, content.Name())) + indexPath := path.Join(absPath, content.Name()) + file, err := os.ReadFile(indexPath) if err != nil { logrus.Debugf("unable to read %s, skipping", content.Name()) continue } + if strings.Contains(string(file), generatedInDistribusi) { + logrus.Debugf("%s was not generated by distribusi, skipping", indexPath) continue } } + files = append(files, path.Join(absPath, content.Name())) } } @@ -477,6 +502,12 @@ func getCaption(c *cli.Context, fpath string) (string, error) { } } + if caption != "" { + logrus.Debug("retrieved caption %s from %s", caption, fpath) + } else { + logrus.Debug("no comment retrieved for %s", fpath) + } + return caption, nil } @@ -569,6 +600,8 @@ func getHref(c *cli.Context, fpath string, mtype string) (bool, string, error) { href = fmt.Sprintf("%s", stype, fname, fname) } + logrus.Debugf("generated href for %s: %s", fname, href) + return unknown, href, nil } @@ -594,6 +627,8 @@ func mkDiv(c *cli.Context, mtype string, href, fname string, unknown bool) (stri } } + logrus.Debugf("generated div wrapper for %s: %s", fname, div) + return div, nil } @@ -613,6 +648,8 @@ func writeIndex(fpath string, html []string, styles string) error { return nil } + logrus.Debugf("loading custom styles from %s", absPath) + body = fmt.Sprintf(htmlBody, generatedInDistribusi, contents, strings.Join(html, "\n")) } } @@ -670,6 +707,7 @@ func wipeGeneratedFiles(dir string) error { if err := removeIndex(fpath); err != nil { return err } + logrus.Debugf("wiping %s as requested", fpath) } return nil }); err != nil { @@ -704,3 +742,19 @@ func shouldSkip(c *cli.Context, fpath string, ignore []string) (bool, error) { return false, nil } + +// getLogFile creates a new log file for debug output. +func getLogFile() (*os.File, error) { + cTime := time.Now() + timeNow := fmt.Sprintf("%v-%v-%v", cTime.Hour(), cTime.Minute(), cTime.Second()) + prefix := fmt.Sprintf("distribusi-go-%s", timeNow) + + file, err := ioutil.TempFile("/tmp", prefix) + if err != nil { + return nil, err + } + + logrus.Debugf("creating %s as debug log file", file.Name()) + + return file, nil +}