From 9c709996d9519d6552e44182440438d080b8789d Mon Sep 17 00:00:00 2001 From: Shulhan Date: Sat, 23 Sep 2023 22:28:18 +0700 Subject: all: move the parseTemplate as method of Session generateFileInput --- session.go | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- template.go | 61 ----------------------------------------------------------- 2 files changed, 59 insertions(+), 65 deletions(-) delete mode 100644 template.go diff --git a/session.go b/session.go index 528cb87..fb848b8 100644 --- a/session.go +++ b/session.go @@ -5,11 +5,14 @@ package awwan import ( "crypto/rsa" + "errors" "fmt" + "io/fs" "os" "os/exec" "path/filepath" "strings" + "text/template" "github.com/shuLhan/share/lib/ascii" "github.com/shuLhan/share/lib/ini" @@ -108,7 +111,7 @@ func (ses *Session) Copy(stmt *Statement) (err error) { return fmt.Errorf("%s: two or more destination arguments is given", logp) } - src, err = parseTemplate(ses, stmt.cmd) + src, err = ses.generateFileInput(stmt.cmd) if err != nil { return fmt.Errorf("%s: %w", logp, err) } @@ -174,7 +177,7 @@ func (ses *Session) Put(stmt *Statement) (err error) { return fmt.Errorf("%s: two or more destination arguments is given", logp) } - local, err = parseTemplate(ses, stmt.cmd) + local, err = ses.generateFileInput(stmt.cmd) if err != nil { return fmt.Errorf("%s: %w", logp, err) } @@ -212,7 +215,7 @@ func (ses *Session) SudoCopy(req *Request, stmt *Statement, withParseInput bool) } if withParseInput { - src, err = parseTemplate(ses, stmt.cmd) + src, err = ses.generateFileInput(stmt.cmd) if err != nil { return fmt.Errorf("%s: %w", logp, err) } @@ -315,7 +318,7 @@ func (ses *Session) SudoPut(stmt *Statement) (err error) { // Apply the session variables into local file to be copied first, and // save them into cache directory. - local, err = parseTemplate(ses, stmt.cmd) + local, err = ses.generateFileInput(stmt.cmd) if err != nil { return fmt.Errorf("%s: %w", logp, err) } @@ -465,6 +468,58 @@ func (ses *Session) executeScriptOnRemote(req *Request, pos linePosition) { } } +// generateFileInput read the content of file input "in", apply the session +// variables, and write the result to ".cache" directory, and return the +// output file path as "out". +// +// For example, if the input file path is "{{.BaseDir}}/a/b/script" then the +// output file path would be "{{.BaseDir}}/.cache/a/b/script". +func (ses *Session) generateFileInput(in string) (out string, err error) { + var ( + logp = `generateFileInput` + + tmpl *template.Template + f *os.File + outDir string + base string + ) + + if libos.IsBinary(in) { + return in, nil + } + + outDir = filepath.Join(ses.BaseDir, defCacheDir, filepath.Dir(in)) + base = filepath.Base(in) + out = filepath.Join(outDir, base) + + err = os.MkdirAll(outDir, 0700) + if err != nil { + return "", fmt.Errorf("%s %s: %w", logp, in, err) + } + + tmpl, err = template.ParseFiles(in) + if err != nil { + return "", fmt.Errorf("%s %s: %w", logp, in, err) + } + + f, err = os.Create(out) + if err != nil { + return "", fmt.Errorf("%s %s: %w", logp, in, err) + } + + err = tmpl.Execute(f, ses) + if err != nil { + return "", fmt.Errorf("%s %s: %w", logp, in, err) + } + + err = f.Close() + if err != nil { + return "", fmt.Errorf("%s %s: %w", logp, in, err) + } + + return out, nil +} + // generatePaths using baseDir return all paths from BaseDir to ScriptDir. func (ses *Session) generatePaths() (err error) { logp := "generatePaths" diff --git a/template.go b/template.go deleted file mode 100644 index 30d3afe..0000000 --- a/template.go +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-FileCopyrightText: 2019 M. Shulhan -// SPDX-License-Identifier: GPL-3.0-or-later - -package awwan - -import ( - "fmt" - "os" - "path/filepath" - "text/template" - - libos "github.com/shuLhan/share/lib/os" -) - -// parseTemplate read the file input "in" and apply the session variables, -// and write the result to ".cache" directory. -func parseTemplate(ses *Session, in string) (out string, err error) { - var ( - logp = "parseTemplate" - - tmpl *template.Template - f *os.File - outDir string - base string - ) - - if libos.IsBinary(in) { - return in, nil - } - - outDir = filepath.Join(ses.BaseDir, defCacheDir, filepath.Dir(in)) - base = filepath.Base(in) - out = filepath.Join(outDir, base) - - err = os.MkdirAll(outDir, 0700) - if err != nil { - return "", fmt.Errorf("%s %s: %w", logp, in, err) - } - - tmpl, err = template.ParseFiles(in) - if err != nil { - return "", fmt.Errorf("%s %s: %w", logp, in, err) - } - - f, err = os.Create(out) - if err != nil { - return "", fmt.Errorf("%s %s: %w", logp, in, err) - } - - err = tmpl.Execute(f, ses) - if err != nil { - return "", fmt.Errorf("%s %s: %w", logp, in, err) - } - - err = f.Close() - if err != nil { - return "", fmt.Errorf("%s %s: %w", logp, in, err) - } - - return out, nil -} -- cgit v1.3