toot/tools/has_update

112 lines
3.4 KiB
Python

#!/usr/bin/env python3
# version: 0.1
# File: /srv/toot/has_update
# Copyright (C) 2023 Cyrille Louarn <echolib+tools@a-lec.org>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>..
#----------------------------------------------------------------------
# XMPP: echolib (echolib@a-lec.org)
#
# Description:
# Search for release update using git
# ! Assume Project is insalled from git
#
# You may use with script (if you do not give argument to has_update)
# No output = no update
# Output update = v[latest] > v[current]
#
# Convenience -v argument (do not use with script): show both versions
#
# RC errors :
# 1 = Online Capture problem
# 2 = Installed Capture problem
#----------------------------------------------------------------------
import requests, subprocess, sys
# Set Project
#------------
owner = "mastodon" # Also used for sudo -u {owner}
name = "mastodon"
helps = """Usage: has_update [argument]
-h : This help !
-v : Show both versions (online, and installed)
"""
#=====================================================#
# Check available version using Git API with requests #
#-----------------------------------------------------#
def get_available_release():
url = f"https://api.github.com/repos/{owner}/{name}/releases/latest"
response = requests.get(url)
if response.status_code == 200:
latest_release = response.json()
return latest_release['tag_name']
else:
print(f"Failed to get online lates release: {response.status_code}")
sys.exit(1)
#===========================================#
# Check installed version using git command #
# Assume Project is insalled from git #
#-------------------------------------------#
def get_installed_release():
try:
result = subprocess.run(
['sudo', '-u', owner, 'git', 'describe', '--tags', '--exact-match'],
stdout=subprocess.PIPE, # Get output
stderr=subprocess.PIPE, # Get error (if any)
text=True, # Set stdout + stderr
check=True # exception if failure
)
# Output captured successfully
return result.stdout.strip()
except subprocess.CalledProcessError as e:
# Handle the case where the command fails
print("Failed to get installed release:", e.stderr.strip())
sys.exit(2)
#======#
# Main #
#------#
# With -h argument, show both versions
if '-h' in sys.argv:
print(helps)
sys.exit(0)
# Get versions (online and local)
available_version = get_available_release()
installed_version = get_installed_release()
# With -v argument, show both versions
if '-v' in sys.argv:
print(f"{owner}:")
print(f"- Available: {available_version}\n-Installed: {installed_version}")
# A new version is available
elif available_version != installed_version:
print(f"{owner}: {installed_version} -> {available_version}")