Skip to content

Commit 82249bd

Browse files
chamecobmcutler
authored andcommitted
Improve common code detection (#54)
* Fix common code detection * Plagiarism progress reports, update .travis.yml * Update .travis.yml * Update .travis.yml * Update .travis.yml * Fix
1 parent f82028d commit 82249bd

File tree

6 files changed

+38
-17
lines changed

6 files changed

+38
-17
lines changed

.travis.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ before_install:
1414
- travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
1515
- rvm use 2.1 --install --binary --fuzzy
1616
install:
17-
- travis_wait 30 stack --no-terminal --install-ghc --copy-bins build
18-
- stack --no-terminal install hlint
17+
- travis_wait 30 stack --install-ghc --copy-bins install language-python
18+
- travis_wait 30 stack --install-ghc --copy-bins build
19+
- stack install hlint
1920
- cp hlint ~/.local/bin
2021
- gem install danger danger-hlint
2122
script:

lichen.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ library
4949
, process
5050
, directory
5151
, filepath
52+
, ansi-terminal
5253
, aeson
5354
, megaparsec
5455
, optparse-applicative

src/Lichen/Error.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module Lichen.Error where
44

5-
import System.IO (stderr)
5+
import System.IO (stderr, hPutStrLn)
66

77
import Data.Monoid ((<>))
88
import qualified Data.Text as T
@@ -24,7 +24,7 @@ data LichenError = LexError (ParseError (Token BS.ByteString) Dec)
2424
deriving Show
2525

2626
printError :: LichenError -> IO ()
27-
printError (LexError e) = T.IO.hPutStrLn stderr "Lexer error: " >> putStrLn (parseErrorPretty e)
27+
printError (LexError e) = T.IO.hPutStrLn stderr "Lexer error: " >> hPutStrLn stderr (parseErrorPretty e)
2828
printError (ParseError t) = T.IO.hPutStrLn stderr ("Parser error: " <> t)
2929
printError (InvalidTokenError t) = T.IO.hPutStrLn stderr ("Invalid token error: " <> t)
3030
printError (InvocationError t) = T.IO.hPutStrLn stderr ("Invocation error: " <> t)

src/Lichen/Plagiarism/Main.hs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import System.FilePath
77

88
import Data.Aeson
99
import Data.Semigroup ((<>))
10+
import qualified Data.Set as Set
1011
import qualified Data.Text as T
1112
import qualified Data.ByteString.Lazy as BS
1213

@@ -24,6 +25,7 @@ import Lichen.Plagiarism.Concatenate
2425
import Lichen.Plagiarism.Highlight
2526
import Lichen.Plagiarism.Report
2627
import Lichen.Plagiarism.Walk
28+
import Lichen.Plagiarism.Shared
2729

2830
parseOptions :: Config -> Parser Config
2931
parseOptions dc = Config
@@ -58,11 +60,20 @@ realMain ic = do
5860
dir <- liftIO $ canonicalizePath p
5961
pdirs <- liftIO . mapM canonicalizePath $ pastDirs config
6062
let concatenate = if allVersions config then concatenateAll else concatenateActive
61-
concatenate dir
62-
mapM_ concatenate pdirs
63-
highlight dir
64-
mapM_ highlight pdirs
65-
prints <- fingerprintDir (language config) (dataDir config </> concatDir config ++ dir)
66-
past <- concat <$> mapM (\x -> fingerprintDir (language config) (dataDir config </> concatDir config ++ x)) pdirs
67-
report dir prints past
63+
progress "Concatenating submissions" $ do
64+
concatenate dir
65+
mapM_ concatenate pdirs
66+
progress "Highlighting concatenated files" $ do
67+
highlight dir
68+
mapM_ highlight pdirs
69+
(prints, past) <- progress "Fingerprinting submissions" $ do
70+
prints <- fingerprintDir (language config) (dataDir config </> concatDir config ++ dir)
71+
past <- concat <$> mapM (\x -> fingerprintDir (language config) (dataDir config </> concatDir config ++ x)) pdirs
72+
return (prints, past)
73+
(sprints, spast) <- progress "Detecting shared code" $ do
74+
let shared = findShared config (fst <$> prints) (fst <$> past)
75+
sprints = (\(x, t) -> (Set.toList $ Set.difference (Set.fromList x) shared, t)) <$> prints
76+
spast = (\(x, t) -> (Set.toList $ Set.difference (Set.fromList x) shared, t)) <$> past
77+
return (sprints, spast)
78+
progress "Generating plagiarism reports" $ report dir sprints spast
6879
where opts c = info (helper <*> parseOptions c) (fullDesc <> progDesc "Run plagiarism detection" <> header "plagiarism - plagiarism detection")

src/Lichen/Plagiarism/Report.hs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import System.FilePath
55

66
import Data.List
77
import qualified Data.ByteString.Lazy as BS
8-
import qualified Data.Set as Set
98

109
import Control.Applicative
1110
import Control.Monad.Reader
@@ -16,20 +15,16 @@ import Lichen.Util
1615
import Lichen.Config.Plagiarism
1716
import Lichen.Plagiarism.Winnow
1817
import Lichen.Plagiarism.Compare
19-
import Lichen.Plagiarism.Shared
2018
import Lichen.Plagiarism.Render
2119
import Lichen.Plagiarism.Render.Index
2220
import Lichen.Plagiarism.Render.Compare
2321

2422
report :: (Show a, Eq a) => FilePath -> [(Fingerprints, a)] -> [(Fingerprints, a)] -> Plagiarism ()
2523
report p prints past = do
2624
config <- ask
27-
let shared = findShared config (fst <$> prints) (fst <$> past)
28-
sprints = (\(x, t) -> (Set.toList $ Set.difference (Set.fromList x) shared, t)) <$> prints
29-
spast = (\(x, t) -> (Set.toList $ Set.difference (Set.fromList x) shared, t)) <$> past
3025
dstPath <- liftIO $ liftA2 (++) (pure $ dataDir config </> reportDir config) $ canonicalizePath p
3126
srcPath <- liftIO $ liftA2 (++) (pure $ dataDir config </> concatDir config) $ canonicalizePath p
32-
let compared = ccmp (topMatches config) sprints spast
27+
let compared = ccmp (topMatches config) prints past
3328
liftIO $ removeDir dstPath >> createDirectoryIfMissing True dstPath
3429
liftIO . createDirectoryIfMissing True $ dstPath </> "compare"
3530
liftIO . BS.writeFile (dstPath </> "index.html") . renderHtml . renderPage config $ renderTable config compared

src/Lichen/Util.hs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ module Lichen.Util where
44

55
import System.Directory
66
import System.FilePath
7+
import System.Console.ANSI
8+
import System.IO (hPutStr, hPutStrLn, stderr)
79

810
import Data.List.Split
11+
import Data.Monoid ((<>))
912

1013
import Control.Monad
14+
import Control.Monad.IO.Class
1115

1216
-- Ex: purify [Maybe 1, Nothing, Maybe 3] = [1, 3]
1317
purify :: [Maybe a] -> [a]
@@ -62,3 +66,12 @@ sq = go . show where
6266
go ('"':s) | last s == '"' = init s
6367
| otherwise = s
6468
go x = x
69+
70+
progress :: MonadIO m => String -> m a -> m a
71+
progress msg body = do
72+
liftIO (hPutStr stderr (msg <> "..."))
73+
ret <- body
74+
liftIO (hSetSGR stderr [SetColor Foreground Vivid Green])
75+
liftIO (hPutStrLn stderr " Done!")
76+
liftIO (hSetSGR stderr [Reset])
77+
return ret

0 commit comments

Comments
 (0)