aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Ceratto <federico.ceratto@gmail.com>2015-03-07 23:55:08 +0000
committerFederico Ceratto <federico.ceratto@gmail.com>2015-03-07 23:55:08 +0000
commit0a107dfd1a53fc00aa34b001fcb2e7ce21759f35 (patch)
tree1eb855855c6689698530e1a692526ae77cd6b9c9
parent59cba7fadd0f70c62168b424eb69c722de146622 (diff)
downloadpackages-0a107dfd1a53fc00aa34b001fcb2e7ce21759f35.tar.gz
packages-0a107dfd1a53fc00aa34b001fcb2e7ce21759f35.zip
Add package scanner
-rw-r--r--package_scanner.nim101
1 files changed, 101 insertions, 0 deletions
diff --git a/package_scanner.nim b/package_scanner.nim
new file mode 100644
index 0000000..8f9bc3f
--- /dev/null
+++ b/package_scanner.nim
@@ -0,0 +1,101 @@
+
+# A very simple Nim package scanner.
+#
+# Scan the package list from:
+# https://github.com/nim-lang/packages/blob/master/packages.json
+#
+# Check the packages for:
+# * Missing/unknown license
+# * Missing description
+# * Missing name
+# * Missing/unknown method
+# * Missing/unreachable repository
+#
+# Usage: nim c -d:ssl -r package_scanner.nim
+#
+# Copyright 2015 Federico Ceratto <federico.ceratto@gmail.com>
+# Released under GPLv3 License, see /usr/share/common-licenses/GPL-3
+
+import httpclient
+import net
+import json
+
+const
+ PKG_LIST_URL = "https://raw.githubusercontent.com/nim-lang/packages/master/packages.json"
+
+ LICENSES = @[
+ "Allegro 4 Giftware",
+ "BSD",
+ "BSD3",
+ "CC0",
+ "GPL",
+ "GPLv2",
+ "GPLv3",
+ "LGPLv2",
+ "LGPLv3",
+ "MIT",
+ "MS-PL",
+ "WTFPL",
+ "libpng",
+ "zlib"
+ ]
+
+ VCS_TYPES = @["git", "hg"]
+
+proc check(): int =
+ var
+ name: string
+ url: string
+
+
+ echo ""
+ let
+ pkg_list = parseJson(getContent(PKG_LIST_URL))
+
+ for pdata in pkg_list:
+ if not pdata.hasKey("name"):
+ echo "E: missing package name"
+ result.inc()
+ continue
+
+ name = pdata["name"].str
+ if not pdata.hasKey("method"):
+ echo "E: ", name, "has no method"
+ result.inc()
+
+ elif not (pdata["method"].str in VCS_TYPES):
+ echo "E: ", name, "has an unknown method: ", pdata["method"].str
+ result.inc()
+
+ if not pdata.hasKey("license"):
+ echo "E: ", name, "has no license"
+ result.inc()
+ elif not (pdata["license"].str in LICENSES):
+ echo "W: ", name, "has an unexpected license: ", pdata["license"]
+
+ if not pdata.hasKey("description"):
+ echo "E: ", name, "has no description"
+ result.inc()
+
+ if not pdata.hasKey("web"):
+ echo "E: ", name, "has no URL"
+ result.inc()
+ continue
+
+ for pdata in pkg_list:
+ if pdata.hasKey("name") and pdata.hasKey("web"):
+ name = pdata["name"].str
+ url = pdata["web"].str
+ try:
+ discard getContent(url, timeout=3000)
+
+ except HttpRequestError, TimeoutError, AssertionError:
+ echo "E: ", name, ": unable to fetch repository ", url, " ", getCurrentExceptionMsg()
+ result.inc()
+
+ echo "Error count: ", result
+ return
+
+when isMainModule:
+ quit(check())
+