kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale
				
				
				
			
		
			
				
	
	
		
			90 wiersze
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			90 wiersze
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
| #!/usr/bin/env python3
 | |
| 
 | |
| import json
 | |
| import logging
 | |
| from argparse import ArgumentParser
 | |
| from functools import reduce
 | |
| from operator import getitem
 | |
| from subprocess import check_output
 | |
| from typing import Dict, List
 | |
| 
 | |
| from packaging.version import InvalidVersion, Version
 | |
| 
 | |
| logger = logging.getLogger(__name__)
 | |
| 
 | |
| 
 | |
| def get_releases() -> List[Dict[str, str]]:
 | |
|     """
 | |
|     Gather all releases from git tags, sorted by version.
 | |
|     Do not include pre releases.
 | |
|     """
 | |
|     output = check_output(
 | |
|         [
 | |
|             *("git", "tag", "-l"),
 | |
|             "--format=%(creatordate:iso-strict)|%(refname:short)",
 | |
|             "--sort=v:refname",  # sort by refname (version sort, not lexicographic)
 | |
|         ],
 | |
|         text=True,
 | |
|     )
 | |
|     result = []
 | |
| 
 | |
|     for line in output.splitlines():
 | |
|         date, _, ref = line.partition("|")
 | |
|         try:
 | |
|             version = Version(ref)
 | |
|             if version.pre is not None:
 | |
|                 logger.warning("ignoring pre release: %s", version)
 | |
|                 continue
 | |
| 
 | |
|         except InvalidVersion as exception:
 | |
|             logger.error("ignoring invalid release: %s", exception)
 | |
|             continue
 | |
| 
 | |
|         result.append({"id": ref, "date": date})
 | |
|     return list(reversed(result))
 | |
| 
 | |
| 
 | |
| def resolve_query(haystack, needle: str):
 | |
|     if isinstance(haystack, list):
 | |
|         needle = int(needle)
 | |
|     return getitem(haystack, needle)
 | |
| 
 | |
| 
 | |
| def main(query: str = None, raw: bool = False) -> int:
 | |
|     releases = get_releases()
 | |
|     data = {
 | |
|         "count": len(releases),
 | |
|         "latest": releases[0],
 | |
|         "releases": releases,
 | |
|     }
 | |
| 
 | |
|     if query is not None:
 | |
|         parts = query.split(".")
 | |
|         result = reduce(resolve_query, parts, data)
 | |
|     else:
 | |
|         result = data
 | |
| 
 | |
|     if raw:
 | |
|         print(result)
 | |
|     else:
 | |
|         print(json.dumps(result, indent=2))
 | |
| 
 | |
|     return 0
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     parser = ArgumentParser("Compile releases data")
 | |
|     parser.add_argument(
 | |
|         "-q",
 | |
|         "--query",
 | |
|         help="Query a specific data",
 | |
|     )
 | |
|     parser.add_argument(
 | |
|         "-r",
 | |
|         "--raw",
 | |
|         action="store_true",
 | |
|         help="Output raw data",
 | |
|     )
 | |
|     args = parser.parse_args()
 | |
|     raise SystemExit(main(query=args.query, raw=args.raw))
 |