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