Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Annlix
ShellCheck
提交
2f5a7be4
S
ShellCheck
项目概览
Annlix
/
ShellCheck
与 Fork 源项目一致
Fork自
镜像 / koalaman / ShellCheck
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
ShellCheck
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2f5a7be4
编写于
11月 04, 2012
作者:
V
Vidar Holen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Added cute simplified API plus a CLI frontend
上级
17633aa2
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
99 addition
and
2 deletion
+99
-2
Shpell/Analytics.hs
Shpell/Analytics.hs
+1
-1
Shpell/Parser.hs
Shpell/Parser.hs
+1
-1
Shpell/Simple.hs
Shpell/Simple.hs
+32
-0
shpell.hs
shpell.hs
+65
-0
未找到文件。
Shpell/Analytics.hs
浏览文件 @
2f5a7be4
...
...
@@ -9,7 +9,7 @@ import Debug.Trace
checks
=
map
runBasicAnalysis
basicChecks
checkAll
=
checkList
checks
runAllAnalytics
=
checkList
checks
checkList
l
t
m
=
foldl
(
\
x
f
->
f
t
x
)
m
l
runBasicAnalysis
f
t
m
=
snd
$
runState
(
doAnalysis
f
t
)
m
...
...
Shpell/Parser.hs
浏览文件 @
2f5a7be4
{-# LANGUAGE NoMonomorphismRestriction #-}
module
Shpell.Parser
(
Token
(
..
),
Note
(
..
),
Severity
(
..
),
parseShell
,
ParseResult
(
..
),
notesFromMap
,
Metadata
(
..
),
doAnalysis
,
doTransform
)
where
module
Shpell.Parser
(
Token
(
..
),
Note
(
..
),
Severity
(
..
),
parseShell
,
ParseResult
(
..
),
ParseNote
(
..
),
notesFromMap
,
Metadata
(
..
),
doAnalysis
,
doTransform
,
sortNotes
)
where
import
Text.Parsec
import
Text.Parsec.Pos
(
initialPos
)
...
...
Shpell/Simple.hs
0 → 100644
浏览文件 @
2f5a7be4
module
Shpell.Simple
(
shpellCheck
,
ShpellComment
,
shpellLine
,
shpellColumn
,
shpellSeverity
,
shpellComment
)
where
import
Shpell.Parser
import
Shpell.Analytics
import
Data.Maybe
import
Text.Parsec.Pos
data
ShpellComment
=
ShpellComment
{
shpellLine
::
Int
,
shpellColumn
::
Int
,
shpellSeverity
::
String
,
shpellComment
::
String
}
instance
Show
ShpellComment
where
show
c
=
concat
[
"("
,
show
$
shpellLine
c
,
","
,
show
$
shpellColumn
c
,
") "
,
shpellSeverity
c
,
": "
,
shpellComment
c
]
shpellCheck
script
=
let
(
ParseResult
result
notes
)
=
parseShell
"-"
script
in
let
allNotes
=
notes
++
(
concat
$
maybeToList
$
do
(
tree
,
map
)
<-
result
let
newMap
=
runAllAnalytics
tree
map
return
$
notesFromMap
newMap
)
in
map
formatNote
$
sortNotes
allNotes
severityToString
s
=
case
s
of
ErrorC
->
"error"
WarningC
->
"warning"
InfoC
->
"info"
StyleC
->
"style"
formatNote
(
ParseNote
pos
severity
text
)
=
ShpellComment
(
sourceLine
pos
)
(
sourceColumn
pos
)
(
severityToString
severity
)
text
shpell.hs
0 → 100644
浏览文件 @
2f5a7be4
import
Control.Monad
import
GHC.Exts
import
GHC.IO.Device
import
Shpell.Simple
import
System.Directory
import
System.Environment
import
System.Exit
import
System.IO
clear
=
ansi
0
ansi
n
=
"
\x1B
["
++
(
show
n
)
++
"m"
colorForLevel
"error"
=
31
-- red
colorForLevel
"warning"
=
33
-- yellow
colorForLevel
"info"
=
33
-- yellow
colorForLevel
"style"
=
31
-- green
colorForLevel
"message"
=
1
-- bold
colorForLevel
"source"
=
0
-- none
colorForLevel
_
=
0
-- none
colorComment
level
comment
=
(
ansi
$
colorForLevel
level
)
++
comment
++
clear
doFile
path
colorFunc
=
do
let
actualPath
=
if
path
==
"-"
then
"/dev/stdin"
else
path
exists
<-
doesFileExist
actualPath
if
exists
then
do
contents
<-
readFile
actualPath
doInput
path
contents
colorFunc
else
do
putStrLn
(
colorFunc
"error"
$
"No such file: "
++
actualPath
)
doInput
filename
contents
colorFunc
=
do
let
fileLines
=
lines
contents
let
comments
=
shpellCheck
contents
let
groups
=
groupWith
shpellLine
comments
if
not
$
null
comments
then
do
mapM_
(
\
x
->
do
let
line
=
fileLines
!!
(
shpellLine
(
head
x
)
-
1
)
putStrLn
""
putStrLn
$
colorFunc
"message"
(
"In "
++
filename
++
" line "
++
(
show
$
shpellLine
(
head
x
))
++
":"
)
putStrLn
(
colorFunc
"source"
line
)
mapM
(
\
c
->
putStrLn
(
colorFunc
(
shpellSeverity
c
)
$
cuteIndent
c
))
x
putStrLn
""
)
groups
else
do
putStrLn
(
"No comments for "
++
filename
)
cuteIndent
comment
=
(
replicate
((
shpellColumn
comment
)
-
1
)
' '
)
++
"^-- "
++
(
shpellComment
comment
)
getColorFunc
=
do
term
<-
hIsTerminalDevice
stdout
return
$
if
term
then
colorComment
else
const
id
main
=
do
args
<-
getArgs
colors
<-
getColorFunc
if
null
args
then
do
hPutStrLn
stderr
"shpell -- bash/sh shell script static analysis tool"
hPutStrLn
stderr
"Usage: shpell filenames..."
exitFailure
else
mapM
(
\
f
->
doFile
f
colors
)
args
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录