Juggle the test to the right place, call it also while saving config to be consistent
This commit is contained in:
parent
7b326d72b1
commit
3353d3d923
@ -189,9 +189,10 @@ func (c *Config) UpdateFromJSON(j []byte) error {
|
||||
}
|
||||
|
||||
// check the command exists
|
||||
_, err := exec.LookPath(newConfig.DownloadProfiles[i].Command)
|
||||
|
||||
_, err := AbsPathToExecutable(newConfig.DownloadProfiles[i].Command)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Could not find %s on the path", newConfig.DownloadProfiles[i].Command)
|
||||
return fmt.Errorf("problem with command '%s': %s", newConfig.DownloadProfiles[i].Command, err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -337,3 +338,28 @@ func (cs *ConfigService) WriteConfig() {
|
||||
}
|
||||
file.Close()
|
||||
}
|
||||
|
||||
// AbsPathToExecutable takes a command name, which may or may not be path-qualified,
|
||||
// and returns the fully qualified path to it, or an error if could not be found, or
|
||||
// if it does not appear to be a file.
|
||||
func AbsPathToExecutable(cmd string) (string, error) {
|
||||
|
||||
pathCmd, err := exec.LookPath(cmd)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not LookPath '%s': %w", cmd, err)
|
||||
}
|
||||
|
||||
execAbsolutePath, err := filepath.Abs(pathCmd)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not get absolute path to '%s': %w", cmd, err)
|
||||
}
|
||||
fi, err := os.Stat(execAbsolutePath)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not get stat '%s': %w", cmd, err)
|
||||
}
|
||||
if !fi.Mode().IsRegular() {
|
||||
return "", fmt.Errorf("'%s' is not a regular file: %w", cmd, err)
|
||||
}
|
||||
|
||||
return execAbsolutePath, nil
|
||||
}
|
||||
|
@ -2,6 +2,8 @@ package config
|
||||
|
||||
import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
@ -172,3 +174,41 @@ func configServiceFromString(configString string) *ConfigService {
|
||||
}
|
||||
return &cs
|
||||
}
|
||||
|
||||
func TestLookForExecutable(t *testing.T) {
|
||||
cmdPath, err := exec.LookPath("sleep")
|
||||
if err != nil {
|
||||
t.Errorf("cannot run this test without knowing about sleep: %s", err)
|
||||
t.FailNow()
|
||||
}
|
||||
cmdDir := filepath.Dir(cmdPath)
|
||||
|
||||
cmd := "sleep"
|
||||
path, err := AbsPathToExecutable(cmd)
|
||||
if assert.NoError(t, err) {
|
||||
assert.Equal(t, cmdPath, path)
|
||||
}
|
||||
|
||||
cmd = cmdPath
|
||||
path, err = AbsPathToExecutable(cmd)
|
||||
if assert.NoError(t, err) {
|
||||
assert.Equal(t, cmdPath, path)
|
||||
}
|
||||
|
||||
cmd = "../../../../../../../../.." + cmdPath
|
||||
path, err = AbsPathToExecutable(cmd)
|
||||
if assert.NoError(t, err) {
|
||||
assert.Equal(t, cmdPath, path)
|
||||
}
|
||||
cmd = "./sleep"
|
||||
_, err = AbsPathToExecutable(cmd)
|
||||
assert.Error(t, err)
|
||||
|
||||
os.Chdir(cmdDir)
|
||||
cmd = "./sleep"
|
||||
path, err = AbsPathToExecutable(cmd)
|
||||
if assert.NoError(t, err) {
|
||||
assert.Equal(t, cmdPath, path)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -281,13 +281,18 @@ func (dl *Download) Begin() {
|
||||
cmdSlice = append(cmdSlice, dl.Url)
|
||||
}
|
||||
|
||||
dl.Log = append(dl.Log, fmt.Sprintf("executing: %s with args: %s", dl.DownloadProfile.Command, strings.Join(cmdSlice, " ")))
|
||||
|
||||
cmdPath, err := absPathToExecutable(dl.DownloadProfile.Command)
|
||||
cmdPath, err := config.AbsPathToExecutable(dl.DownloadProfile.Command)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
dl.State = STATE_FAILED
|
||||
dl.Finished = true
|
||||
dl.FinishedTS = time.Now()
|
||||
dl.Log = append(dl.Log, fmt.Sprintf("error finding executable for downloader: %s", err.Error()))
|
||||
dl.Lock.Unlock()
|
||||
return
|
||||
}
|
||||
|
||||
dl.Log = append(dl.Log, fmt.Sprintf("executing: %s (%s) with args: %s", dl.DownloadProfile.Command, cmdPath, strings.Join(cmdSlice, " ")))
|
||||
|
||||
cmd := exec.Command(cmdPath, cmdSlice...)
|
||||
cmd.Dir = dl.Config.Server.DownloadPath
|
||||
log.Printf("Executing command executable: %s) in %s", cmdPath, dl.Config.Server.DownloadPath)
|
||||
@ -299,7 +304,6 @@ func (dl *Download) Begin() {
|
||||
dl.FinishedTS = time.Now()
|
||||
dl.Log = append(dl.Log, fmt.Sprintf("error setting up stdout pipe: %v", err))
|
||||
dl.Lock.Unlock()
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@ -373,28 +377,6 @@ func (dl *Download) Begin() {
|
||||
dl.Lock.Unlock()
|
||||
}
|
||||
|
||||
func absPathToExecutable(cmd string) (string, error) {
|
||||
|
||||
pathCmd, err := exec.LookPath(cmd)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not LookPath '%s': %w", cmd, err)
|
||||
}
|
||||
|
||||
execAbsolutePath, err := filepath.Abs(pathCmd)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not get absolute path to '%s': %w", cmd, err)
|
||||
}
|
||||
fi, err := os.Stat(execAbsolutePath)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("could not get stat '%s': %w", cmd, err)
|
||||
}
|
||||
if !fi.Mode().IsRegular() {
|
||||
return "", fmt.Errorf("'%s' is not a regular file: %w", cmd, err)
|
||||
}
|
||||
|
||||
return execAbsolutePath, nil
|
||||
}
|
||||
|
||||
// updateDownload updates the download based on data from the reader. Expects the
|
||||
// Download to be unlocked.
|
||||
func (dl *Download) updateDownload(r io.Reader) {
|
||||
|
@ -1,15 +1,11 @@
|
||||
package download
|
||||
|
||||
import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/tardisx/gropple/config"
|
||||
)
|
||||
|
||||
@ -364,41 +360,3 @@ Deleting original file The Greatest Shot In Television [2WoDQBhJCVQ].f140.m4a (p
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestLookForExecutable(t *testing.T) {
|
||||
cmdPath, err := exec.LookPath("sleep")
|
||||
if err != nil {
|
||||
t.Errorf("cannot run this test without knowing about sleep: %s", err)
|
||||
t.FailNow()
|
||||
}
|
||||
cmdDir := filepath.Dir(cmdPath)
|
||||
|
||||
cmd := "sleep"
|
||||
path, err := absPathToExecutable(cmd)
|
||||
if assert.NoError(t, err) {
|
||||
assert.Equal(t, cmdPath, path)
|
||||
}
|
||||
|
||||
cmd = cmdPath
|
||||
path, err = absPathToExecutable(cmd)
|
||||
if assert.NoError(t, err) {
|
||||
assert.Equal(t, cmdPath, path)
|
||||
}
|
||||
|
||||
cmd = "../../../../../../../../.." + cmdPath
|
||||
path, err = absPathToExecutable(cmd)
|
||||
if assert.NoError(t, err) {
|
||||
assert.Equal(t, cmdPath, path)
|
||||
}
|
||||
cmd = "./sleep"
|
||||
_, err = absPathToExecutable(cmd)
|
||||
assert.Error(t, err)
|
||||
|
||||
os.Chdir(cmdDir)
|
||||
cmd = "./sleep"
|
||||
path, err = absPathToExecutable(cmd)
|
||||
if assert.NoError(t, err) {
|
||||
assert.Equal(t, cmdPath, path)
|
||||
}
|
||||
|
||||
}
|
||||
|
2
main.go
2
main.go
@ -15,7 +15,7 @@ import (
|
||||
|
||||
func main() {
|
||||
versionInfo := &version.Manager{
|
||||
VersionInfo: version.Info{CurrentVersion: "v1.1.1-alpha.1"},
|
||||
VersionInfo: version.Info{CurrentVersion: "v1.1.1-alpha.2"},
|
||||
}
|
||||
log.Printf("Starting gropple %s - https://github.com/tardisx/gropple", versionInfo.GetInfo().CurrentVersion)
|
||||
|
||||
|
@ -84,7 +84,10 @@
|
||||
|
||||
<label x-bind:for="'config-profiles-'+i+'-command'">Command to run</label>
|
||||
<input type="text" x-bind:id="'config-profiles-'+i+'-command'" class="input-long" placeholder="name" x-model="profile.command" />
|
||||
<span class="pure-form-message">Which command to run. Your path will be searched, or you can specify the full path here.</span>
|
||||
<span class="pure-form-message">Which command to run. Your path will be searched, or you can specify the full path here.
|
||||
If you are using gropple in portable mode and store the executables with the gropple executable, use a prefix of
|
||||
<tt>./</tt>, for instance <tt>yt-dlp.exe</tt>.
|
||||
</span>
|
||||
|
||||
|
||||
<label>Arguments</label>
|
||||
|
Loading…
x
Reference in New Issue
Block a user