on master help sign in
Merge pull request #3396 from enolan/port-none

Allow specifying "--port none" to not start the interpreter server

commit16b0fe8341f4bffdb293c9b1f7da1752c806037f authorAhmad Salim Al-Sibahi <asal@itu.dk> dateSun 4 Sep 2016, 20:51 (10 years ago) parent289df05be27074
9 files changed+46−19
main/Main.hs+5−1 src/Idris/AbsSyntax.hs+4−6 src/Idris/AbsSyntaxTree.hs+5−1 src/Idris/CmdOptions.hs+13−1 src/Idris/DeepSeq.hs+5 src/Idris/Main.hs+4−2 src/Idris/ModeCommon.hs+3−3 src/Idris/REPL.hs+3−3 src/Util/Net.hs+4−2
main/Main.hs+5−1
@@ -40,7 +40,11 @@ runIdris opts = do
4040 [] -> return ()
4141 (c:_) -> do setVerbose False
4242 setQuiet True
43− runIO $ runClient (getPort opts) c
43+ case getPort opts of
44+ Just DontListen ->
45+ ifail "\"--client\" and \"--port none\" are incompatible"
46+ Just (ListenPort port) -> runIO $ runClient (Just port) c
47+ Nothing -> runIO $ runClient Nothing c
4448 runIO exitSuccess
4549
4650 -- Work with Idris packages.
src/Idris/AbsSyntax.hs+4−6
@@ -2632,12 +2632,10 @@ getClient (Client x) = Just x
26322632getClient _ = Nothing
26332633
26342634-- Get the first valid port
2635−getPort :: [Opt] -> Maybe PortID
2636−getPort [] = Nothing
2637−getPort (Port p:xs)
2638− | all (`elem` ['0'..'9']) p = Just (PortNumber $ fromIntegral (read p))
2639− | otherwise = getPort xs
2640−getPort (_:xs) = getPort xs
2635+getPort :: [Opt] -> Maybe REPLPort
2636+getPort [] = Nothing
2637+getPort (Port p : xs) = Just p
2638+getPort (_ : xs) = getPort xs
26412639
26422640opt :: (Opt -> Maybe a) -> [Opt] -> [a]
26432641opt = mapMaybe
src/Idris/AbsSyntaxTree.hs+5−1
@@ -49,6 +49,7 @@ import Data.Traversable (Traversable)
4949import Data.Typeable
5050import Data.Foldable (Foldable)
5151import GHC.Generics (Generic)
52+import Network.Socket(PortNumber)
5253
5354import Debug.Trace
5455
@@ -514,7 +515,7 @@ data Opt = Filename String
514515 | ErrContext
515516 | ShowImpl
516517 | Verbose
517− | Port String -- ^ REPL TCP port
518+ | Port REPLPort -- ^ REPL TCP port
518519 | IBCSubDir String
519520 | ImportDir String
520521 | SourceDir String
@@ -553,6 +554,9 @@ data Opt = Filename String
553554 | NoOldTacticDeprecationWarnings -- ^ Don't show deprecation warnings for old-style tactics
554555 deriving (Show, Eq, Generic)
555556
557+data REPLPort = DontListen | ListenPort PortNumber
558+ deriving (Eq, Generic, Show)
559+
556560-- Parsed declarations
557561
558562data Fixity = Infixl { prec :: Int }
src/Idris/CmdOptions.hs+13−1
@@ -23,6 +23,10 @@ import IRTS.CodegenCommon
2323
2424import Options.Applicative
2525import Options.Applicative.Arrows
26+import Options.Applicative.Types (ReadM(..))
27+import Control.Monad.Trans (lift)
28+import Control.Monad.Trans.Reader (ask)
29+import Control.Monad.Trans.Except (throwE)
2630import Data.Char
2731import Data.Maybe
2832
@@ -137,7 +141,7 @@ parseFlags = many $
137141 <|> flag' WarnOnly (long "warn")
138142
139143 <|> (Pkg <$> strOption (short 'p' <> long "package" <> help "Add package as a dependency"))
140− <|> (Port <$> strOption (long "port" <> metavar "PORT" <> help "REPL TCP port"))
144+ <|> (Port <$> option portReader (long "port" <> metavar "PORT" <> help "REPL TCP port - pass \"none\" to not bind any port"))
141145
142146 -- Package commands
143147 <|> (PkgBuild <$> strOption (long "build" <> metavar "IPKG" <> help "Build package"))
@@ -209,6 +213,14 @@ parseFlags = many $
209213 getExt s = fromMaybe (error ("Unknown extension " ++ s)) (maybeRead s)
210214 maybeRead :: String -> Maybe LanguageExt
211215 maybeRead = fmap fst . listToMaybe . reads
216+ portReader :: ReadM REPLPort
217+ portReader =
218+ ((ListenPort . fromIntegral) <$> auto) <|>
219+ (ReadM $ do opt <- ask
220+ if map toLower opt == "none"
221+ then return $ DontListen
222+ else lift $ throwE $ ErrorMsg $
223+ "got " <> opt <> " expected port number or \"none\"")
212224
213225parseVersion :: Parser (a -> a)
214226parseVersion = infoOption getIdrisVersion (short 'v' <> long "version" <> help "Print version information")
src/Idris/DeepSeq.hs+5
@@ -22,6 +22,7 @@ import IRTS.CodegenCommon (OutputType (..))
2222import Util.DynamicLinker
2323
2424import Control.DeepSeq
25+import Network.Socket(PortNumber)
2526
2627import qualified Cheapskate.Types as CT
2728import qualified Idris.Docstrings as D
@@ -47,6 +48,9 @@ instance NFData DynamicLib where
4748instance NFData IdrisColour where
4849 rnf (IdrisColour _ x2 x3 x4 x5) = rnf x2 `seq` rnf x3 `seq` rnf x4 `seq` rnf x5 `seq` ()
4950
51+instance NFData PortNumber where
52+ rnf x = rnf $ show x
53+
5054-- Handle doesn't have an NFData instance
5155instance NFData OutputMode where
5256 rnf (RawOutput x) = ()
@@ -57,6 +61,7 @@ instance NFData ConsoleWidth
5761instance NFData PrimFn
5862instance NFData SyntaxRules
5963instance NFData Opt
64+instance NFData REPLPort
6065instance NFData TIData
6166instance NFData IOption
6267instance NFData LanguageExt
src/Idris/Main.hs+4−2
@@ -108,7 +108,7 @@ idrisMain opts =
108108 [expr] -> return (Just expr)
109109 let immediate = opt getEvalExpr opts
110110 let port = case getPort opts of
111− Nothing -> defaultPort
111+ Nothing -> ListenPort defaultPort
112112 Just p -> p
113113
114114 when (DefaultTotal `elem` opts) $ do i <- getIState
@@ -209,7 +209,9 @@ idrisMain opts =
209209
210210 when (runrepl && not idesl) $ do
211211-- clearOrigPats
212− startServer port orig mods
212+ case port of
213+ DontListen -> return ()
214+ ListenPort port' -> startServer port' orig mods
213215 runInputT (replSettings (Just historyFile)) $ repl (force orig) mods efile
214216 let idesock = IdemodeSocket `elem` opts
215217 when (idesl) $ idemodeStart idesock orig inputs
src/Idris/ModeCommon.hs+3−3
@@ -27,14 +27,14 @@ import Prelude hiding ((<$>), (.), id)
2727import System.Directory
2828import Control.Monad
2929import Control.Monad.Trans.State.Strict (get)
30−import Network (PortID(PortNumber))
30+import Network.Socket (PortNumber)
3131import Data.Maybe
3232import Data.List hiding (group)
3333import Control.DeepSeq
3434
3535
36−defaultPort :: PortID
37−defaultPort = PortNumber (fromIntegral 4294)
36+defaultPort :: PortNumber
37+defaultPort = fromIntegral 4294
3838
3939
4040loadInputs :: [FilePath] -> Maybe Int -> Idris [FilePath]
src/Idris/REPL.hs+3−3
@@ -154,7 +154,7 @@ repl orig mods efile
154154 else show n
155155
156156-- | Run the REPL server
157−startServer :: PortID -> IState -> [FilePath] -> Idris ()
157+startServer :: PortNumber -> IState -> [FilePath] -> Idris ()
158158startServer port orig fn_in = do tid <- runIO $ forkIO (serverLoop port)
159159 return ()
160160 where serverLoop port = withSocketsDo $
@@ -213,10 +213,10 @@ processNetCmd orig i h fn cmd
213213 IdeMode n _ -> ist {idris_outputmode = IdeMode n h}
214214
215215-- | Run a command on the server on localhost
216−runClient :: Maybe PortID -> String -> IO ()
216+runClient :: Maybe PortNumber -> String -> IO ()
217217runClient port str = withSocketsDo $ do
218218 let port' = fromMaybe defaultPort port
219− res <- X.try (connectTo "localhost" port')
219+ res <- X.try (connectTo "localhost" $ PortNumber port')
220220 case res of
221221 Right h -> do
222222 hSetEncoding h utf8
src/Util/Net.hs+4−2
@@ -8,13 +8,14 @@ Maintainer : The Idris Community.
88module Util.Net (listenOnLocalhost, listenOnLocalhostAnyPort) where
99
1010import Network hiding (socketPort)
11−import Network.Socket hiding (sClose, PortNumber)
11+import Network.Socket hiding (sClose)
1212import Network.BSD (getProtocolNumber)
1313import Control.Exception (bracketOnError)
1414
1515-- Copied from upstream impl of listenOn
1616-- bound to localhost interface instead of iNADDR_ANY
17−listenOnLocalhost (PortNumber port) = do
17+listenOnLocalhost :: PortNumber -> IO Socket
18+listenOnLocalhost port = do
1819 proto <- getProtocolNumber "tcp"
1920 localhost <- inet_addr "127.0.0.1"
2021 bracketOnError
@@ -27,6 +28,7 @@ listenOnLocalhost (PortNumber port) = do
2728 return sock
2829 )
2930
31+listenOnLocalhostAnyPort :: IO (Socket, PortNumber)
3032listenOnLocalhostAnyPort = do
3133 proto <- getProtocolNumber "tcp"
3234 localhost <- inet_addr "127.0.0.1"