1# -*- coding: utf-8 -*-
2#
3# Copyright 2007-2011 Brecht Machiels
4# Copyright 2009-2010 Chris Roberts
5# Copyright 2009-2011 Scott McCreary
6# Copyright 2009 Alexander Deynichenko
7# Copyright 2009 HaikuBot (aka RISC)
8# Copyright 2010-2011 Jack Laxson (Jrabbit)
9# Copyright 2011 Ingo Weinhold
10# Copyright 2013 Oliver Tappe
11# Copyright 2020 Fran��ois Revol
12# Distributed under the terms of the MIT License.
13
14# -- Modules ------------------------------------------------------------------
15
16import sys
17
18from .Utils import sysExit
19
20try:
21	import requests
22except ImportError:
23	pass
24
25
26# -----------------------------------------------------------------------------
27
28# -- Checks releases from GitHub --------------------------------------------------
29
30class ReleaseCheckerForGitHub(object):
31	def __init__(self, uri, version):
32		self.uri = uri
33		self.currentVersion = version
34
35		#(unusedType, self.uri, self.rev) = parseCheckoutUri(uri)
36
37	def check(self):
38		parts = self.uri.split("/")
39		if parts[2] != "github.com":
40			sysExit('Bad URI in GitHub ReleaseChecker!')
41
42		project = "/".join(parts[3:5])
43		# some "releases" are actually just tags
44		releases = "releases/download" in self.uri
45		endpoint = "releases" if releases else "tags"
46
47		request = "http://api.github.com/repos/%s/%s" % (project, endpoint)
48		print("Checking from %s" % request)
49		headers = {
50			"Accept": "application/vnd.github.v3+json",
51			"User-Agent": "HaikuPorter"
52		}
53		with requests.get(request, headers=headers) as r:
54			j = r.json()
55			if not j:
56				print("Error getting JSON from %s" % request)
57				return False
58			if len(j) == 0:
59				print("No release found from %s" % request)
60				return False
61			if releases:
62				# first one should be latest
63				tag_name = j[0]['tag_name']
64				name = j[0]['name']
65				if self.currentVersion != tag_name:
66					return tag_name
67				if self.currentVersion != name:
68					return name
69
70			else: # tags
71				if self.currentVersion not in parts[-1]:
72					print("cannot find version prefix in URI")
73					return False
74				prefix = parts[-1][0:parts[-1].find(self.currentVersion)]
75				# first one should be latest
76				# actually not always, cf. cronie-crond/cronie
77				name = j[0]['name']
78				name = name[len(prefix):]
79				if self.currentVersion != name:
80					return name
81
82		return False
83
84
85# -- release checker factory function for given URI ----------------------------
86
87def createReleaseChecker(uri, version):
88	"""Creates an appropriate release checker for the given URI"""
89
90	if "requests" not in sys.modules:
91		sysExit('requests missing for ReleaseChecker!')
92
93	lowerUri = uri.lower()
94	if "://github.com/" in lowerUri:
95		return ReleaseCheckerForGitHub(uri, version)
96	else:
97		return None
98