fix [#26093] Install Add-On Fails and deletes script

problem was on installing a file which was already installed, when the source and target paths match python deleted the file.

now check if the selected file is inside any of the addon search paths and abort with an error.
This commit is contained in:
Campbell Barton 2011-02-21 07:33:59 +00:00
parent 8172207d20
commit b26a4dc4af

@ -22,6 +22,8 @@ import os
import shutil
import addon_utils
from bpy.props import StringProperty, BoolProperty, EnumProperty
def ui_items_general(col, context):
""" General UI Theme Settings (User Interface)
@ -878,8 +880,8 @@ class USERPREF_PT_addons(bpy.types.Panel):
cats.discard("")
if USERPREF_PT_addons._addons_cats != cats:
bpy.types.WindowManager.addon_filter = bpy.props.EnumProperty(items=[(cat, cat, "") for cat in ["All", "Enabled", "Disabled"] + sorted(cats)], name="Category", description="Filter add-ons by category")
bpy.types.WindowManager.addon_search = bpy.props.StringProperty(name="Search", description="Search within the selected filter")
bpy.types.WindowManager.addon_filter = EnumProperty(items=[(cat, cat, "") for cat in ["All", "Enabled", "Disabled"] + sorted(cats)], name="Category", description="Filter add-ons by category")
bpy.types.WindowManager.addon_search = StringProperty(name="Search", description="Search within the selected filter")
USERPREF_PT_addons._addons_cats = cats
sups_default = {'OFFICIAL', 'COMMUNITY'}
@ -887,7 +889,7 @@ class USERPREF_PT_addons(bpy.types.Panel):
sups.discard("")
if USERPREF_PT_addons._addons_sups != sups:
bpy.types.WindowManager.addon_support = bpy.props.EnumProperty(items=[(sup, sup.title(), "") for sup in reversed(sorted(sups))], name="Support", description="Display support level", default=sups_default, options={'ENUM_FLAG'})
bpy.types.WindowManager.addon_support = EnumProperty(items=[(sup, sup.title(), "") for sup in reversed(sorted(sups))], name="Support", description="Display support level", default=sups_default, options={'ENUM_FLAG'})
USERPREF_PT_addons._addons_sups = sups
split = layout.split(percentage=0.2)
@ -1010,8 +1012,6 @@ class USERPREF_PT_addons(bpy.types.Panel):
row.operator("wm.addon_disable", icon='CHECKBOX_HLT', text="", emboss=False).module = module_name
from bpy.props import *
class WM_OT_addon_enable(bpy.types.Operator):
"Enable an addon"
bl_idname = "wm.addon_enable"
@ -1079,9 +1079,22 @@ class WM_OT_addon_install(bpy.types.Operator):
path_addons = bpy.utils.user_resource('SCRIPTS', "addons", create=True)
if not path_addons:
self.report({'WARNING'}, "Failed to get addons path")
self.report({'ERROR'}, "Failed to get addons path")
return {'CANCELLED'}
# Check if we are installing from a target path,
# doing so causes 2+ addons of same name or when the same from/to
# location is used, removal of the file!
addon_path = ""
pyfile_dir = os.path.dirname(pyfile)
for addon_path in addon_utils.paths():
if os.path.samefile(pyfile_dir, addon_path):
self.report({'ERROR'}, "Source file is in the addon search path: %r" % addon_path)
return {'CANCELLED'}
del addon_path
del pyfile_dir
# done checking for exceptional case
contents = set(os.listdir(path_addons))
#check to see if the file is in compressed format (.zip)
@ -1108,7 +1121,7 @@ class WM_OT_addon_install(bpy.types.Operator):
traceback.print_exc()
return {'CANCELLED'}
else:
else:
path_dest = os.path.join(path_addons, os.path.basename(pyfile))
if self.overwrite: