From f159610ed02196b33fa30e1c3bba45fa947d48a9 Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Tue, 12 Jul 2022 00:10:41 -0400 Subject: [PATCH] 17344: Install ruby arv as arv-ruby, and arvados-client as arv. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- cmd/arvados-package/fpm.go | 1 + lib/cli/external.go | 17 ++++++++++++++--- lib/install/deps.go | 14 +++++++++++--- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/cmd/arvados-package/fpm.go b/cmd/arvados-package/fpm.go index c337d8563b..c26cbe8875 100644 --- a/cmd/arvados-package/fpm.go +++ b/cmd/arvados-package/fpm.go @@ -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", diff --git a/lib/cli/external.go b/lib/cli/external.go index 7d9bb6f200..54dfd9a91f 100644 --- a/lib/cli/external.go +++ b/lib/cli/external.go @@ -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) diff --git a/lib/install/deps.go b/lib/install/deps.go index 57bb9af51e..fb2de8a72d 100644 --- a/lib/install/deps.go +++ b/lib/install/deps.go @@ -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 } -- 2.30.2