17344: Install ruby arv as arv-ruby, and arvados-client as arv.
[arvados.git] / lib / cli / external.go
index 35933f99fc2afafdb970cc2127587f182364f094..54dfd9a91f9fff8429da645d39ee9029e5571335 100644 (file)
@@ -12,7 +12,7 @@ import (
        "strings"
        "syscall"
 
-       "git.curoverse.com/arvados.git/lib/cmd"
+       "git.arvados.org/arvados.git/lib/cmd"
 )
 
 var (
@@ -22,7 +22,6 @@ var (
        Copy = externalCmd{"arv-copy"}
        Tag  = externalCmd{"arv-tag"}
        Ws   = externalCmd{"arv-ws"}
-       Run  = externalCmd{"arv-run"}
 
        Keep = cmd.Multi(map[string]cmd.Handler{
                "get":       externalCmd{"arv-get"},
@@ -31,9 +30,6 @@ var (
                "normalize": externalCmd{"arv-normalize"},
                "docker":    externalCmd{"arv-keepdocker"},
        })
-       Pipeline = cmd.Multi(map[string]cmd.Handler{
-               "run": externalCmd{"arv-run-pipeline-instance"},
-       })
        // user, group, container, specimen, etc.
        APICall = apiCallCmd{}
 )
@@ -61,7 +57,7 @@ func (cmd apiCallCmd) RunCommand(prog string, args []string, stdin io.Reader, st
                return 2
        }
        model := split[len(split)-1]
-       return externalCmd{"arv"}.RunCommand("arv", legacyFlagsToFront(model, args), stdin, stdout, stderr)
+       return rubyArvCmd{model}.RunCommand(prog, args, stdin, stdout, stderr)
 }
 
 type rubyArvCmd struct {
@@ -69,7 +65,18 @@ type rubyArvCmd struct {
 }
 
 func (rc rubyArvCmd) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
-       return externalCmd{"arv"}.RunCommand("arv", legacyFlagsToFront(rc.subcommand, args), stdin, stdout, stderr)
+       wrapprog := "arv-ruby"
+       if _, err := exec.LookPath(wrapprog); err != nil && !strings.Contains(prog, "arv ") {
+               // arv-ruby isn't in PATH (i.e., installation method
+               // wasn't a recent "arvados-server install", which
+               // symlinks /usr/bin/arv-ruby ->
+               // /var/lib/arvados/bin/arv), so fall back to looking
+               // for the arvados-cli program as "arv". (But don't do
+               // this if we are being run as "arv" -- that would
+               // probably cause a recursive fork bomb.)
+               wrapprog = "arv"
+       }
+       return externalCmd{wrapprog}.RunCommand(wrapprog, legacyFlagsToFront(rc.subcommand, args), stdin, stdout, stderr)
 }
 
 type externalCmd struct {
@@ -94,7 +101,7 @@ func (ec externalCmd) RunCommand(prog string, args []string, stdin io.Reader, st
                return 1
        case *exec.Error:
                fmt.Fprintln(stderr, err)
-               if ec.prog == "arv" || ec.prog == "arv-run-pipeline-instance" {
+               if ec.prog == "arv" || ec.prog == "arv-ruby" {
                        fmt.Fprint(stderr, rubyInstallHints)
                } else if strings.HasPrefix(ec.prog, "arv-") {
                        fmt.Fprint(stderr, pythonInstallHints)
@@ -117,7 +124,7 @@ https://doc.arvados.org/install for more details.
 Note: This subcommand uses the "arvados" Python module. If that is
 not installed, try:
 * "pip install arvados" (either as root or in a virtualenv), or
-* "sudo apt-get install python-arvados-python-client", or
+* "sudo apt-get install python3-arvados-python-client", or
 * see https://doc.arvados.org/install for more details.
 
 `