packages feed

cachix-1.7: src/Cachix/Client.hs

module Cachix.Client
  ( main,
  )
where

import Cachix.Client.Commands as Commands
import qualified Cachix.Client.Config as Config
import qualified Cachix.Client.Daemon as Daemon
import qualified Cachix.Client.Daemon.Client as Daemon.Client
import Cachix.Client.Env (cachixoptions, mkEnv)
import Cachix.Client.OptionsParser (CachixCommand (..), DaemonCommand (..), getOpts)
import Cachix.Client.Version (cachixVersion)
import Cachix.Deploy.ActivateCommand as ActivateCommand
import qualified Cachix.Deploy.Agent as AgentCommand
import qualified Cachix.Deploy.OptionsParser as DeployOptions
import qualified Hercules.CNix as CNix
import qualified Hercules.CNix.Util as CNix.Util
import Protolude
import System.Console.AsciiProgress (displayConsoleRegions)
import qualified System.Posix.Signals as Signal

main :: IO ()
main = displayConsoleRegions $ do
  (flags, command) <- getOpts
  env <- mkEnv flags

  installSignalHandlers

  initNixStore

  let cachixOptions = cachixoptions env
  case command of
    AuthToken token -> Commands.authtoken env token
    Config configCommand -> Config.run cachixOptions configCommand
    Daemon (DaemonRun daemonOptions pushOptions mcacheName) -> Daemon.start env daemonOptions pushOptions mcacheName
    Daemon (DaemonStop daemonOptions) -> Daemon.Client.stop env daemonOptions
    Daemon (DaemonPushPaths daemonOptions storePaths) -> Daemon.Client.push env daemonOptions storePaths
    Daemon (DaemonWatchExec pushOptions cacheName cmd args) -> Commands.watchExecDaemon env pushOptions cacheName cmd args
    GenerateKeypair name -> Commands.generateKeypair env name
    Push pushArgs -> Commands.push env pushArgs
    Pin pingArgs -> Commands.pin env pingArgs
    Import pushOptions name uri -> Commands.import' env pushOptions name uri
    WatchStore watchArgs name -> Commands.watchStore env watchArgs name
    WatchExec pushArgs name cmd args -> Commands.watchExec env pushArgs name cmd args
    Use name useOptions -> Commands.use env name useOptions
    Remove name -> Commands.remove env name
    Version -> putText cachixVersion
    DeployCommand (DeployOptions.Agent opts) -> AgentCommand.run cachixOptions opts
    DeployCommand (DeployOptions.Activate opts) -> ActivateCommand.run env opts

-- | Install client-wide signal handlers.
installSignalHandlers :: IO ()
installSignalHandlers = do
  -- Ignore sigPIPE.
  -- By default, sigPIPE will crash the entire program when the reading end of a pipe is closed.
  -- By ignoring sigPIPE, an exception is thrown inline instead, which we can handle.
  _ <- Signal.installHandler Signal.sigPIPE Signal.Ignore Nothing

  return ()

-- | Initialize the Nix library via CNix.
initNixStore :: IO ()
initNixStore = do
  signalset <- Signal.getSignalMask

  -- Initialize the Nix library
  CNix.init

  -- darwin: restore the signal mask modified by Nix
  -- https://github.com/cachix/cachix/issues/501
  Signal.setSignalMask signalset

  -- Interrupt Nix before throwing UserInterrupt
  CNix.Util.installDefaultSigINTHandler