17344: Install ruby arv as arv-ruby, and arvados-client as arv.
authorTom Clegg <tom@curii.com>
Tue, 12 Jul 2022 04:10:41 +0000 (00:10 -0400)
committerTom Clegg <tom@curii.com>
Thu, 14 Jul 2022 13:21:41 +0000 (09:21 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

cmd/arvados-package/fpm.go
lib/cli/external.go
lib/install/deps.go

index c337d8563ba53e8d3156bc47f9471132519ecae9..c26cbe8875292fd64c7ae099afa2f24719b32c9d 100644 (file)
@@ -107,6 +107,7 @@ func fpm(ctx context.Context, opts opts, stdin io.Reader, stdout, stderr io.Writ
                "/usr/bin/arvados-client",
                "/usr/bin/arvados-server",
                "/usr/bin/arv",
+               "/usr/bin/arv-ruby",
                "/usr/bin/arv-tag",
                "/var/lib/arvados",
                "/var/www/.gem",
index 7d9bb6f200253405b15fbd3edaed82132efe61e4..54dfd9a91f9fff8429da645d39ee9029e5571335 100644 (file)
@@ -57,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 {
@@ -65,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 {
@@ -90,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" {
+               if ec.prog == "arv" || ec.prog == "arv-ruby" {
                        fmt.Fprint(stderr, rubyInstallHints)
                } else if strings.HasPrefix(ec.prog, "arv-") {
                        fmt.Fprint(stderr, pythonInstallHints)
index 57bb9af51e497289791369827777b117fdedaf46..fb2de8a72dc09af9e6dd1d31bf9a0776c36b2679 100644 (file)
@@ -692,12 +692,20 @@ rsync -a --delete-after build/ /var/lib/arvados/workbench2/
 
                // Symlink user-facing programs /usr/bin/x ->
                // /var/lib/arvados/bin/x
-               for _, prog := range []string{"arvados-client", "arvados-server", "arv", "arv-tag"} {
-                       err = os.Remove("/usr/bin/" + prog)
+               for _, srcdst := range [][]string{
+                       {"arvados-client", "arvados-client"},
+                       {"arvados-client", "arv"},
+                       {"arvados-server", "arvados-server"},
+                       {"arv", "arv-ruby"},
+                       {"arv-tag", "arv-tag"},
+               } {
+                       src := srcdst[0]
+                       dst := srcdst[1]
+                       err = os.Remove("/usr/bin/" + dst)
                        if err != nil && !errors.Is(err, os.ErrNotExist) {
                                return 1
                        }
-                       err = os.Symlink("/var/lib/arvados/bin/"+prog, "/usr/bin/"+prog)
+                       err = os.Symlink("/var/lib/arvados/bin/"+src, "/usr/bin/"+dst)
                        if err != nil {
                                return 1
                        }