فهرست منبع

eliminate gis env ADDON_PATH, see https://trac.osgeo.org/grass/ticket/1696

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@53495 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 12 سال پیش
والد
کامیت
c66a1732ac
5فایلهای تغییر یافته به همراه97 افزوده شده و 18 حذف شده
  1. 9 4
      gui/wxpython/core/globalvar.py
  2. 74 2
      gui/wxpython/core/utils.py
  3. 2 2
      gui/wxpython/lmgr/frame.py
  4. 5 1
      gui/wxpython/modules/extensions.py
  5. 7 9
      lib/init/grass.py

+ 9 - 4
gui/wxpython/core/globalvar.py

@@ -168,15 +168,20 @@ def UpdateGRASSAddOnCommands():
         if not os.path.exists(path) or not os.path.isdir(path):
             continue
         for fname in os.listdir(path):
+            if fname in ['docs', 'modules.xml']:
+                continue
             if grassScripts: # win32
                 name, ext = os.path.splitext(fname)
                 if name not in grassCmd:
-                    grassCmd.add(name)
-                    nCmd += 1
-                if ext in grassScripts.keys() and \
+                    if ext not in ['.exe', '.py']:
+                        continue
+                    if name not in grassCmd:
+                        grassCmd.add(name)
+                        nCmd += 1
+                if ext == '.py' and \
+                        ext in grassScripts.keys() and \
                         name not in grassScripts[ext]:
                     grassScripts[ext].append(name)
-                    nCmd += 1
             else:
                 if fname not in grassCmd:
                     grassCmd.add(fname)

+ 74 - 2
gui/wxpython/core/utils.py

@@ -758,11 +758,84 @@ def GetSettingsPath():
 
     # keep location of settings files rc and wx in sync with lib/init/grass.py
     if sys.platform == 'win32':
-        return os.path.join(os.getenv('APPDATA'), 'grass%d' % version)
+        return os.path.join(os.getenv('APPDATA'), 'GRASS%d' % version)
     
     return os.path.join(os.getenv('HOME'), '.grass%d' % version)
 
+def StoreEnvVariable(key, value, envFile = None):
+    """!Store environmental variable
 
+    @param key env key
+    @param value env value
+    @param envFile path to the environmental file (None for default location)
+    """
+    windows = sys.platform == 'win32'
+    if not envFile:
+        gVersion = grass.version()['version'].split('.', 1)[0]
+        if not windows:
+            envFile = os.path.join(os.getenv('HOME'), '.grass%s' % gVersion, 'bashrc')
+        else:
+            envFile = os.path.join(os.getenv('APPDATA'), 'GRASS%s' % gVersion, 'env.bat')
+    
+    # read env file
+    environ = dict()
+    if os.path.exists(envFile):
+        try:
+            fd = open(envFile)
+        except IOError, e:
+            sys.stderr.write(_("Unable to open file '%s'") % envFile)
+            return
+        for line in fd.readlines():
+            try:
+                key, value = line.split(' ', 1).strip().split('=', 1)
+            except:
+                sys.stderr.write(_("%s: unable to parse '%s'") % (envFile, line))
+                continue
+            if key in environ:
+                sys.stderr.write(_("Duplicated key: %s") % key)
+            environ[key] = value
+        
+        fd.close()
+    
+    # update environmental variables
+    environ[key] = value
+    
+    # write update env file
+    try:
+        fd = open(envFile, 'w')
+    except IOError, e:
+        sys.stderr.write(_("Unable to create file '%s'") % envFile)
+        return
+    if windows:
+        expCmd = 'set'
+    else:
+        expCmd = 'export'
+    
+    for key, value in environ.iteritems():
+        fd.write('%s %s=%s\n' % (expCmd, key, value))
+        
+    fd.close()
+
+def SetAddOnPath(addonPath = None, key = 'PATH'):
+    """!Set default AddOn path
+
+    @addonPath path to addons (None for default)
+    @key env key - 'PATH' or 'BASE'
+    """
+    gVersion = grass.version()['version'].split('.', 1)[0]
+    # update env file
+    if not addonPath:
+        if sys.platform != 'win32':
+            addonPath = os.path.join(os.path.join(os.getenv('HOME'),
+                                                  '.grass%s' % gVersion,
+                                                  'addons'))
+        else:
+            addonPath = os.path.join(os.path.join(os.getenv('APPDATA'),
+                                                  'GRASS%s' % gVersion,
+                                                  'addons'))
+    
+    StoreEnvVariable('GRASS_ADDON_' + key, addonPath)
+    os.environ['GRASS_ADDON_' + key] = addonPath
 
 # From lib/gis/col_str.c, except purple which is mentioned
 # there but not given RGB values
@@ -786,7 +859,6 @@ rgb2str = {}
 for (s,r) in str2rgb.items():
     rgb2str[ r ] = s
 
-
 def color_resolve(color):
     if len(color) > 0 and color[0] in "0123456789":
         rgb = tuple(map(int, color.split(':')))

+ 2 - 2
gui/wxpython/lmgr/frame.py

@@ -41,6 +41,7 @@ from grass.script          import core as grass
 
 from core.gcmd             import RunCommand, GError, GMessage
 from core.settings         import UserSettings, GetDisplayVectSettings
+from core.utils            import SetAddOnPath
 from gui_core.preferences  import MapsetAccess, PreferencesDialog, EVT_SETTINGS_CHANGED
 from lmgr.layertree        import LayerTree, LMIcons
 from lmgr.menudata         import ManagerData
@@ -708,8 +709,7 @@ class GMFrame(wx.Frame):
                                    caption = _("Update Addons path?"),
                                    style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
             if dlg.ShowModal() == wx.ID_YES:
-                os.environ['GRASS_ADDON_PATH'] = os.pathsep.join(addonPath)
-                RunCommand('g.gisenv', set = 'ADDON_PATH=%s' % os.environ['GRASS_ADDON_PATH'])
+                SetAddOnPath(os.pathsep.join(addonPath), key = 'PATH')
         
         self.goutput.WriteCmdLog(_("Launching script '%s'...") % filename)
         self.goutput.RunCmd([filename], switchPage = True)

+ 5 - 1
gui/wxpython/modules/extensions.py

@@ -32,6 +32,7 @@ from grass.script import task as gtask
 
 from core             import globalvar
 from core.gcmd        import GError, RunCommand
+from core.utils       import SetAddOnPath
 from gui_core.forms   import GUI
 from gui_core.widgets import ItemTree, GListCtrl
 from gui_core.ghelp   import SearchModuleWindow
@@ -225,10 +226,13 @@ class InstallExtensionWindow(wx.Frame):
         
     def OnDone(self, cmd, returncode):
         if returncode == 0:
+            if not os.getenv('GRASS_ADDON_BASE'):
+                SetAddOnPath(key = 'BASE')
+            
             globalvar.UpdateGRASSAddOnCommands()
             log = self.parent.GetLogWindow()
             log.GetPrompt().SetFilter(None)
-        
+
     def OnItemSelected(self, event):
         """!Item selected"""
         item = event.GetItem()

+ 7 - 9
lib/init/grass.py

@@ -48,9 +48,11 @@ else:
 if sys.platform == 'win32':
     grass_config_dirname = "GRASS7"
     grass_config_dir = os.path.join(os.getenv('APPDATA'), grass_config_dirname)
+    grass_env_file = os.path.join(grass_config_dir, 'env.bat')
 else:
     grass_config_dirname = ".grass7"
     grass_config_dir = os.path.join(os.getenv('HOME'), grass_config_dirname)
+    grass_env_file = os.path.join(grass_config_dir, 'bashrc')
 
 gisbase = os.path.normpath(gisbase)
 
@@ -638,17 +640,10 @@ def load_gisrc():
     location = os.path.join(gisdbase, location_name, mapset)
 
 def set_env_from_gisrc():
+    ### TODO: eliminate all env-from-gisrc
     import locale
     kv = read_gisrc()
     
-    ### addons
-    if kv.get('ADDON_PATH'):
-        addon_path = kv.get('ADDON_PATH')
-        if os.getenv('GRASS_ADDON_PATH'):
-            os.environ['GRASS_ADDON_PATH'] += os.pathsep + addon_path
-        else:
-            os.environ['GRASS_ADDON_PATH'] = addon_path
-    
     ### language
     language = kv.get('LANG')
     if language:
@@ -900,9 +895,12 @@ def bash_startup():
     f.write("PS1='GRASS %s (%s):\w > '\n" % (grass_version, location_name))
     f.write("PROMPT_COMMAND=\"'%s'\"\n" % os.path.join(gisbase, 'etc', 'prompt.py'))
     
-    path = os.path.join(userhome, ".grass.bashrc")
+    # read environmental variables
+    path = os.path.join(userhome, ".grass.bashrc") # left for backward compatibility
     if os.access(path, os.R_OK):
         f.write(readfile(path) + '\n')
+    if os.access(grass_env_file, os.R_OK):
+        f.write(readfile(grass_env_file) + '\n')
     
     f.write("export PATH=\"%s\"\n" % os.getenv('PATH'))
     f.write("export HOME=\"%s\"\n" % userhome) # restore user home path