aboutsummaryrefslogtreecommitdiff
path: root/package_scanner.nim
blob: c3312bf8b2c90df92806a79a0b96032381cf14f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121

# A very simple Nim package scanner.
#
# Scans the package list from this repository.
#
# Check the packages for:
#  * Missing name
#  * Missing/unknown method
#  * Missing/unreachable repository
#  * Missing tags
#  * Missing description
#  * Missing/unknown license
#
# 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
import os

const

  LICENSES = @[
    "Allegro 4 Giftware",
    "BSD",
    "BSD3",
    "CC0",
    "GPL",
    "GPLv2",
    "GPLv3",
    "LGPLv2",
    "LGPLv3",
    "MIT",
    "MS-PL",
    "WTFPL",
    "libpng",
    "zlib"
  ]

  VCS_TYPES = @["git", "hg"]

proc canFetchNimbleRepository(name: string, urlJson: JsonNode): bool =
  # The fetch is a lie!
  # TODO: Make this check the actual repo url and check if there is a
  #       nimble file in it
  result = true
  var url: string

  if not urlJson.isNil:
    url = urlJson.str

    try:
      discard getContent(url, timeout=1000)
    except HttpRequestError, TimeoutError:
      echo "E: ", name, ": unable to fetch repository ", url, " ",
           getCurrentExceptionMsg()
      result = false
    except AssertionError:
      echo "W: ", name, ": httpclient failed ", url, " ",
           getCurrentExceptionMsg()


proc check(): int =
  var
    name: string

  echo ""

  let
    pkg_list = parseJson(readFile(getCurrentDir() / "packages.json"))

  for pdata in pkg_list:
    name = if pdata.hasKey("name"): pdata["name"].str else: nil

    if name.isNil:
      echo "E: missing package name"
      result.inc()

    elif 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()

    elif not pdata.hasKey("url"):
      echo "E: ", name, " has no URL"
      result.inc()

    elif not canFetchNimbleRepository(name, pdata["web"]):
      result.inc()

    elif not pdata.hasKey("tags"):
      echo "E: ", name, " has no tags"
      result.inc()

    elif not pdata.hasKey("description"):
      echo "E: ", name, " has no description"
      result.inc()

    elif not pdata.hasKey("license"):
      echo "E: ", name, " has no license"
      result.inc()

    else:
      # Other warnings should go here
      if not (pdata["license"].str in LICENSES):
        echo "W: ", name, " has an unexpected license: ", pdata["license"]


  echo ""
  echo "Problematic packages count: ", result


when isMainModule:
  quit(check())