Search code examples
installationhomebrewfile-permissionslinuxbrew

Set executable permission on script installed with Homebrew


I wrote my first tap, so I'm still not sure how it works. I wrote this small formula:

class Konversation < Formula
  desc "Konversation is a tool to generate rich and diversified responses to the user of a voice application."
  homepage "https://github.com/rewe-digital-incubator/Konversation/"
  url "https://github.com/rewe-digital-incubator/Konversation/releases/download/1.0.0/konversation-cli.jar"
  sha256 "6123d126278faae2419f5de00411a1b67ae57e0cf2265a5d484ed6f9786baaca"

  def install
    prefix.install "#{buildpath}/konversation-cli.jar"
    File.write("#{buildpath}/konversation", "java -jar #{prefix}/konversation-cli.jar $@")
    bin.install "#{buildpath}/konversation"
    system "chmod", "+x", "#{bin}/konversation"
  end
end

However I cannot run my tool since the "konversation" executable has no x permission. I tried to fix that with a system chmod, however I see that my x flag is removed after the installation by brew as some kind of cleanup:

==> Cleaning
Fixing /home/linuxbrew/.linuxbrew/opt/konversation/bin/konversation permissions from 777 to 444

How can I set the file permissions correctly?

Please note that I don't want to host the shell script itself somewhere, since I see no advance in packaging the shell script and the jar file in another zip file for destitution.

If you want to try it yourself try this command:

brew install rekire/packages/konversation

Solution

  • Shell scripts need to have a shebang line, otherwise the postinstall cleaner will set its permissions as though it were not an executable. In this specific case, I suggest:

    • use bin.write_jar_script instead -- this will set up the correct environment for JAR scripts
    • install .jars to libexec instead of prefix -- to avoid polluting the prefix with unnecessary files.

    Example formula from Homebrew/homebrew-core