SVN: UX improvements #136
@ -19,6 +19,12 @@ from .threaded.background_process import Processes
|
||||
class SVN_addon_preferences(AddonPreferences):
|
||||
bl_idname = __package__
|
||||
|
||||
is_svn_installed: BoolProperty(
|
||||
name="Is SVN Installed",
|
||||
description="Whether the `svn` command works at all in the user's command line. If not, user needs to install SVN",
|
||||
default=False
|
||||
)
|
||||
|
||||
repositories: CollectionProperty(type=SVN_repository)
|
||||
|
||||
def init_repo(self, context, repo_path: Path or str):
|
||||
|
@ -27,12 +27,14 @@ class SVN_scene_properties(PropertyGroup):
|
||||
description="Absolute directory path of the SVN repository's root in the file system",
|
||||
)
|
||||
|
||||
def get_repo(self, context):
|
||||
def get_repo(self, context) -> Optional['SVN_repository']:
|
||||
"""Return the current repository.
|
||||
Depending on preferences, this is either the repo the current .blend file is in,
|
||||
or whatever repo is selected in the preferences UI.
|
||||
"""
|
||||
prefs = get_addon_prefs(context)
|
||||
if not prefs.is_svn_installed:
|
||||
return
|
||||
|
||||
if prefs.active_repo_mode == 'CURRENT_BLEND':
|
||||
return self.get_scene_repo(context)
|
||||
@ -40,15 +42,20 @@ class SVN_scene_properties(PropertyGroup):
|
||||
return prefs.active_repo
|
||||
|
||||
def get_scene_repo(self, context) -> Optional['SVN_repository']:
|
||||
"""Return the repository of the current file, even if the add-on is
|
||||
configured to another repository.
|
||||
"""
|
||||
prefs = get_addon_prefs(context)
|
||||
if not prefs.is_svn_installed:
|
||||
return
|
||||
|
||||
if not self.svn_url or not self.svn_directory:
|
||||
return
|
||||
|
||||
prefs = get_addon_prefs(context)
|
||||
for repo in prefs.repositories:
|
||||
if (repo.url == self.svn_url) and (Path(repo.directory) == Path(self.svn_directory)):
|
||||
return repo
|
||||
|
||||
|
||||
registry = [
|
||||
SVN_scene_properties,
|
||||
]
|
||||
|
@ -4,7 +4,6 @@
|
||||
import subprocess
|
||||
from typing import List
|
||||
|
||||
|
||||
def get_credential_commands(context) -> List[str]:
|
||||
repo = context.scene.svn.get_repo(context)
|
||||
assert (repo.is_cred_entered), "No username or password entered for this repository. The UI shouldn't have allowed you to get into a state where you can press an SVN operation button without having your credentials entered, so this is a bug!"
|
||||
@ -29,6 +28,9 @@ def execute_svn_command(context, command: List[str], *, ignore_errors=False, pri
|
||||
SVN root.
|
||||
"""
|
||||
repo = context.scene.svn.get_repo(context)
|
||||
if "svn" not in command:
|
||||
command.insert(0, "svn")
|
||||
|
||||
if use_cred:
|
||||
command += get_credential_commands(context)
|
||||
|
||||
@ -46,3 +48,7 @@ def execute_svn_command(context, command: List[str], *, ignore_errors=False, pri
|
||||
print(f"Command returned error: {command}")
|
||||
print(err_msg)
|
||||
raise error
|
||||
|
||||
def check_svn_installed():
|
||||
code, message = subprocess.getstatusoutput('svn')
|
||||
return code != 127
|
@ -4,7 +4,7 @@
|
||||
from ..svn_info import get_svn_info
|
||||
from ..util import get_addon_prefs
|
||||
from .. import constants
|
||||
from .execute_subprocess import execute_svn_command
|
||||
from .execute_subprocess import execute_svn_command, check_svn_installed
|
||||
from .background_process import BackgroundProcess, Processes
|
||||
from bpy.types import Operator
|
||||
from bpy.props import StringProperty
|
||||
@ -64,11 +64,18 @@ def ensure_svn_of_current_file(_scene=None):
|
||||
"""
|
||||
|
||||
context = bpy.context
|
||||
prefs = get_addon_prefs(context)
|
||||
prefs.is_svn_installed = check_svn_installed()
|
||||
if not prefs.is_svn_installed:
|
||||
return
|
||||
|
||||
scene_svn = context.scene.svn
|
||||
|
||||
prefs = get_addon_prefs(context)
|
||||
prefs.sync_repo_info_file()
|
||||
|
||||
if prefs.active_repo_idx == -1 and len(prefs.repositories) > 0:
|
||||
prefs.active_repo_idx = 0
|
||||
|
||||
repo = prefs.active_repo
|
||||
if repo and repo.is_cred_entered and repo.authenticated:
|
||||
status = Processes.get('Status')
|
||||
|
@ -149,8 +149,10 @@ class SVN_UL_file_list(UIList):
|
||||
|
||||
row.prop(self, 'show_file_paths', text="",
|
||||
toggle=True, icon="FILE_FOLDER")
|
||||
row.prop(context.scene.svn.get_repo(context),
|
||||
'file_search_filter', text="")
|
||||
|
||||
repo = context.scene.svn.get_repo(context)
|
||||
if repo:
|
||||
row.prop(repo, 'file_search_filter', text="")
|
||||
|
||||
|
||||
def draw_process_info(context, layout):
|
||||
|
@ -90,6 +90,9 @@ class SVN_UL_log(UIList):
|
||||
|
||||
def is_log_useful(context):
|
||||
repo = context.scene.svn.get_repo(context)
|
||||
if not repo:
|
||||
return False
|
||||
|
||||
if len(repo.log) == 0 or len(repo.external_files) == 0:
|
||||
return False
|
||||
active_file = repo.active_file
|
||||
|
@ -99,12 +99,34 @@ class SVN_MT_add_repo(Menu):
|
||||
|
||||
|
||||
def draw_prefs(self, context):
|
||||
if not self.is_svn_installed:
|
||||
draw_prefs_no_svn(self, context)
|
||||
return
|
||||
|
||||
if self.checkout_mode:
|
||||
draw_prefs_checkout(self, context)
|
||||
else:
|
||||
draw_prefs_repos(self, context)
|
||||
|
||||
|
||||
def draw_prefs_no_svn(self, context):
|
||||
terminal, url = "terminal", "https://subversion.apache.org/packages.html"
|
||||
system = platform.system()
|
||||
if system == "Windows":
|
||||
terminal = "command line (cmd.exe)"
|
||||
url = "https://subversion.apache.org/packages.html#windows"
|
||||
elif system == "Darwin":
|
||||
terminal = "Mac terminal"
|
||||
url = "https://subversion.apache.org/packages.html#osx"
|
||||
|
||||
layout = self.layout
|
||||
col = layout.column()
|
||||
col.alert=True
|
||||
col.label(text="Please ensure that Subversion (aka. SVN) is installed on your system.")
|
||||
col.label(text=f"Typing `svn` into the {terminal} should yield a result.")
|
||||
layout.operator("wm.url_open", icon='URL', text='Open Subversion Distribution Page').url=url
|
||||
|
||||
|
||||
def draw_prefs_checkout(self, context):
|
||||
def get_terminal_howto():
|
||||
msg_windows = "If you don't, cancel this operation and toggle it using Window->Toggle System Console."
|
||||
|
Loading…
Reference in New Issue
Block a user