1
1
mirror of https://github.com/github/semantic.git synced 2024-12-01 09:15:01 +03:00

Add development mode

When developing locally, especially when using break to look at
structure, the timeout is too quick. Instead of manually updating the
timeout to a long duration, I figure disabling it when needed in the
context of ghci would be nicer.
This commit is contained in:
Rick Winfrey 2016-10-11 15:22:37 -05:00
parent 4611283966
commit e7c09831bc
2 changed files with 15 additions and 3 deletions

View File

@ -26,6 +26,7 @@ data CmdLineOptions = CmdLineOptions
, outputFilePath :: Maybe FilePath , outputFilePath :: Maybe FilePath
, noIndex :: Bool , noIndex :: Bool
, extraArgs :: [ExtraArg] , extraArgs :: [ExtraArg]
, developmentMode' :: Bool
} }
-- | Arguments for the program (includes command line, environment, and defaults). -- | Arguments for the program (includes command line, environment, and defaults).
@ -38,6 +39,7 @@ data Arguments = Arguments
, diffMode :: DiffMode , diffMode :: DiffMode
, shaRange :: Both (Maybe String) , shaRange :: Both (Maybe String)
, filePaths :: [FilePath] , filePaths :: [FilePath]
, developmentMode :: Bool
} deriving (Show) } deriving (Show)
-- | Returns Arguments for the program from parsed command line arguments. -- | Returns Arguments for the program from parsed command line arguments.
@ -62,6 +64,7 @@ programArguments CmdLineOptions{..} = do
(_, _) -> CommitDiff (_, _) -> CommitDiff
, shaRange = fetchShas extraArgs , shaRange = fetchShas extraArgs
, filePaths = filePaths , filePaths = filePaths
, developmentMode = developmentMode'
} }
where where
fetchPaths :: [ExtraArg] -> [FilePath] fetchPaths :: [ExtraArg] -> [FilePath]
@ -85,6 +88,7 @@ args gitDir sha1 sha2 filePaths format = Arguments
, diffMode = CommitDiff , diffMode = CommitDiff
, shaRange = Just <$> both sha1 sha2 , shaRange = Just <$> both sha1 sha2
, filePaths = filePaths , filePaths = filePaths
, developmentMode = False
} }
-- | 7 seconds -- | 7 seconds

View File

@ -49,6 +49,7 @@ argumentsParser = info (version <*> helper <*> argumentsP)
<*> optional (strOption (long "output" <> short 'o' <> help "output directory for split diffs, defaults to stdout if unspecified")) <*> optional (strOption (long "output" <> short 'o' <> help "output directory for split diffs, defaults to stdout if unspecified"))
<*> switch (long "no-index" <> help "compare two paths on the filesystem") <*> switch (long "no-index" <> help "compare two paths on the filesystem")
<*> some (argument (eitherReader parseShasAndFiles) (metavar "SHA_A..SHAB FILES...")) <*> some (argument (eitherReader parseShasAndFiles) (metavar "SHA_A..SHAB FILES..."))
<*> switch (long "development" <> short 'd' <> help "set development mode which prevents timeout behavior by default")
where where
parseShasAndFiles :: String -> Either String ExtraArg parseShasAndFiles :: String -> Either String ExtraArg
parseShasAndFiles s = case matchRegex regex s of parseShasAndFiles s = case matchRegex regex s of
@ -66,8 +67,12 @@ version = infoOption versionString (long "version" <> short 'V' <> help "output
-- | Compare changes between two commits. -- | Compare changes between two commits.
diffCommits :: Arguments -> IO () diffCommits :: Arguments -> IO ()
diffCommits args@Arguments{..} = do diffCommits args@Arguments{..} = do
ts <- Timeout.timeout timeoutInMicroseconds (fetchDiffs args) ts <- fetchTerms args
writeToOutput output (maybe mempty R.concatOutputs ts) writeToOutput output (maybe mempty R.concatOutputs ts)
where fetchTerms args = if developmentMode
then Just <$> fetchDiffs args
else Timeout.timeout timeoutInMicroseconds (fetchDiffs args)
-- | Compare two paths on the filesystem (compariable to git diff --no-index). -- | Compare two paths on the filesystem (compariable to git diff --no-index).
diffPaths :: Arguments -> Both FilePath -> IO () diffPaths :: Arguments -> Both FilePath -> IO ()
@ -99,14 +104,17 @@ fetchDiff' Arguments{..} filepath = do
let sources = fromMaybe (Source.emptySourceBlob filepath) <$> sourcesAndOids let sources = fromMaybe (Source.emptySourceBlob filepath) <$> sourcesAndOids
let sourceBlobs = Source.idOrEmptySourceBlob <$> sources let sourceBlobs = Source.idOrEmptySourceBlob <$> sources
let textDiff = D.textDiff (parserForFilepath filepath) diffArguments sourceBlobs let textDiff = D.textDiff (parserForFilepath filepath) diffArguments sourceBlobs
text <- liftIO $ Timeout.timeout timeoutInMicroseconds textDiff
text <- fetchText textDiff
truncatedPatch <- liftIO $ D.truncatedDiff diffArguments sourceBlobs truncatedPatch <- liftIO $ D.truncatedDiff diffArguments sourceBlobs
pure $ fromMaybe truncatedPatch text pure $ fromMaybe truncatedPatch text
where where
diffArguments = R.DiffArguments { format = format, output = output } diffArguments = R.DiffArguments { format = format, output = output }
fetchText textDiff = if developmentMode
then liftIO $ Timeout.timeout timeoutInMicroseconds textDiff
else liftIO $ Just <$> textDiff
pathsToDiff :: Arguments -> Both String -> IO [FilePath] pathsToDiff :: Arguments -> Both String -> IO [FilePath]
pathsToDiff Arguments{..} shas = withRepository lgFactory gitDir $ do pathsToDiff Arguments{..} shas = withRepository lgFactory gitDir $ do