summaryrefslogtreecommitdiff
path: root/tools/linter
diff options
context:
space:
mode:
Diffstat (limited to 'tools/linter')
-rwxr-xr-xtools/linter/main.rb28
1 files changed, 28 insertions, 0 deletions
diff --git a/tools/linter/main.rb b/tools/linter/main.rb
new file mode 100755
index 0000000..1198fd1
--- /dev/null
+++ b/tools/linter/main.rb
@@ -0,0 +1,28 @@
+#!/usr/bin/env ruby
+# must be run in the root directory of the repo
+# currently it only checks if code in src/kernel/ uses anything arch-dependent
+
+$return = 0
+
+def warn(msg)
+ STDERR.puts "[LINTER] #{msg}"
+ $return = 1
+end
+
+whitelist = ["arch/generic.h"]
+
+Dir["src/kernel/**.?"]
+ .each do |path|
+ File.read(path)
+ .lines
+ .map(&:strip) # strip whitespace
+ .filter{|line| line[0] == '#'} # find preprocessor directives
+ .map{|line| line[1..].strip} # get rid of the #, strip again
+ .filter{|l| l.start_with? "include"} # find includes
+ .map{|l| /([<"](.+)[">])/.match(l)[2]} # get the name of the included file
+ .filter{|l| l.start_with? "arch/"} # find files in arch/
+ .filter{|l| not whitelist.include? l} # filter out whitelisted headers
+ .each{|inc| warn "#{path} includes #{inc}"}
+ end
+
+exit $return