1#!/usr/local/bin/python3.8 2 3############################################################################ 4# 5# MODULE: g.extension.all 6# 7# AUTHOR(S): Martin Landa <landa.martin gmail.com> 8# 9# PURPOSE: Rebuilds or removes locally installed GRASS Addons extensions 10# 11# COPYRIGHT: (C) 2011-2013 by Martin Landa, and the GRASS Development Team 12# 13# This program is free software under the GNU General 14# Public License (>=v2). Read the file COPYING that 15# comes with GRASS for details. 16# 17############################################################################# 18 19#%module 20#% label: Rebuilds or removes all locally installed GRASS Addons extensions. 21#% description: By default only extensions built against different GIS Library are rebuilt. 22#% keyword: general 23#% keyword: installation 24#% keyword: extensions 25#%end 26#%option 27#% key: operation 28#% type: string 29#% description: Operation to be performed 30#% required: no 31#% options: rebuild,remove 32#% answer: rebuild 33#%end 34#%flag 35#% key: f 36#% label: Force operation (required for removal) 37#% end 38from __future__ import print_function 39import os 40import sys 41 42try: 43 import xml.etree.ElementTree as etree 44except ImportError: 45 import elementtree.ElementTree as etree # Python <= 2.4 46 47import grass.script as gscript 48from grass.exceptions import CalledModuleError 49 50 51def get_extensions(): 52 addon_base = os.getenv('GRASS_ADDON_BASE') 53 if not addon_base: 54 gscript.fatal(_("%s not defined") % "GRASS_ADDON_BASE") 55 fXML = os.path.join(addon_base, 'modules.xml') 56 if not os.path.exists(fXML): 57 return [] 58 59 # read XML file 60 fo = open(fXML, 'r') 61 try: 62 tree = etree.fromstring(fo.read()) 63 except Exception as e: 64 gscript.error(_("Unable to parse metadata file: %s") % e) 65 fo.close() 66 return [] 67 68 fo.close() 69 70 libgis_rev = gscript.version()['libgis_revision'] 71 ret = list() 72 for tnode in tree.findall('task'): 73 gnode = tnode.find('libgis') 74 if gnode is not None and \ 75 gnode.get('revision', '') != libgis_rev: 76 ret.append(tnode.get('name')) 77 78 return ret 79 80 81def main(): 82 remove = options['operation'] == 'remove' 83 if remove or flags['f']: 84 extensions = gscript.read_command( 85 'g.extension', 86 quiet=True, 87 flags='a').splitlines() 88 else: 89 extensions = get_extensions() 90 91 if not extensions: 92 if remove: 93 gscript.info(_("No extension found. Nothing to remove.")) 94 else: 95 gscript.info( 96 _("Nothing to rebuild. Rebuilding process can be forced with -f flag.")) 97 return 0 98 99 if remove and not flags['f']: 100 gscript.message(_("List of extensions to be removed:")) 101 print(os.linesep.join(extensions)) 102 gscript.message( 103 _("You must use the force flag (-f) to actually remove them. Exiting.")) 104 return 0 105 106 for ext in extensions: 107 gscript.message('-' * 60) 108 if remove: 109 gscript.message(_("Removing extension <%s>...") % ext) 110 else: 111 gscript.message(_("Reinstalling extension <%s>...") % ext) 112 gscript.message('-' * 60) 113 if remove: 114 operation = 'remove' 115 operation_flags = 'f' 116 else: 117 operation = 'add' 118 operation_flags = '' 119 try: 120 gscript.run_command('g.extension', flags=operation_flags, 121 extension=ext, operation=operation) 122 except CalledModuleError: 123 gscript.error(_("Unable to process extension:%s") % ext) 124 125 return 0 126 127if __name__ == "__main__": 128 options, flags = gscript.parser() 129 sys.exit(main()) 130