Addon Manager: improve git branch changing

This commit is contained in:
Chris Hennes
2025-02-06 11:03:00 -06:00
committed by Chris Hennes
parent fd126aba1b
commit d4ea028edf
4 changed files with 83 additions and 20 deletions

View File

@@ -49,6 +49,8 @@ try:
if FreeCAD.GuiUp:
import FreeCADGui
loadUi = FreeCADGui.PySideUic.loadUi
else:
FreeCADGui = None
@@ -63,7 +65,7 @@ except ImportError:
return string
def Version():
return 0, 22, 0, "dev"
return 1, 1, 0, "dev"
class ConsoleReplacement:
"""If FreeCAD's Console is not available, create a replacement by redirecting FreeCAD

View File

@@ -69,6 +69,21 @@ else:
import urllib.request
import ssl
if fci.FreeCADGui:
loadUi = fci.loadUi
else:
try:
from PySide6.QtUiTools import QUiLoader
except ImportError:
from PySide2.QtUiTools import QUiLoader
def loadUi(ui_file: str) -> QtWidgets.QWidget:
q_ui_file = QtCore.QFile(ui_file)
q_ui_file.open(QtCore.QFile.OpenModeFlag.ReadOnly)
loader = QUiLoader()
return loader.load(ui_file)
# @package AddonManager_utilities
# \ingroup ADDONMANAGER
# \brief Utilities to work across different platforms, providers and python versions

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
# ***************************************************************************
# * *
# * Copyright (c) 2022-2023 FreeCAD Project Association *
# * Copyright (c) 2022-2025 The FreeCAD Project Association AISBL *
# * *
# * This file is part of FreeCAD. *
# * *
@@ -22,14 +22,22 @@
# ***************************************************************************
import os
from typing import Dict
import FreeCAD
import FreeCADGui
from addonmanager_git import initialize_git
import addonmanager_freecad_interface as fci
import addonmanager_utilities as utils
from PySide import QtWidgets, QtCore
from addonmanager_git import initialize_git, GitFailed
translate = FreeCAD.Qt.translate
try:
from PySide import QtWidgets, QtCore
except ImportError:
try:
from PySide6 import QtWidgets, QtCore
except ImportError:
from PySide2 import QtWidgets, QtCore
translate = fci.translate
class ChangeBranchDialog(QtWidgets.QWidget):
@@ -39,9 +47,7 @@ class ChangeBranchDialog(QtWidgets.QWidget):
def __init__(self, path: str, parent=None):
super().__init__(parent)
self.ui = FreeCADGui.PySideUic.loadUi(
os.path.join(os.path.dirname(__file__), "change_branch.ui")
)
self.ui = utils.loadUi(os.path.join(os.path.dirname(__file__), "change_branch.ui"))
self.item_filter = ChangeBranchDialogFilter()
self.ui.tableView.setModel(self.item_filter)
@@ -54,6 +60,9 @@ class ChangeBranchDialog(QtWidgets.QWidget):
# Figure out what row gets selected:
git_manager = initialize_git()
if git_manager is None:
return
row = 0
self.current_ref = git_manager.current_branch(path)
selection_model = self.ui.tableView.selectionModel()
@@ -111,14 +120,51 @@ class ChangeBranchDialog(QtWidgets.QWidget):
if result == QtWidgets.QMessageBox.Cancel:
return
gm = initialize_git()
remote_name = ref["ref_name"]
_, _, local_name = ref["ref_name"].rpartition("/")
self._change_branch(self.item_model.path, ref)
def _change_branch(self, path: str, ref: Dict[str, str]) -> None:
"""Change the git clone in `path` to git ref `ref`. Emits the branch_changed signal
on success."""
remote_name = ref["ref_name"]
_, _, local_name = ref["ref_name"].rpartition("/")
gm = initialize_git()
if gm is None:
self._show_no_git_dialog()
return
try:
if ref["upstream"]:
gm.checkout(self.item_model.path, remote_name)
gm.checkout(path, remote_name)
else:
gm.checkout(self.item_model.path, remote_name, args=["-b", local_name])
gm.checkout(path, remote_name, args=["-b", local_name])
self.branch_changed.emit(self.current_ref, local_name)
except GitFailed:
self._show_git_failed_dialog()
def _show_no_git_dialog(self):
QtWidgets.QMessageBox.critical(
self,
translate("AddonsInstaller", "Cannot find git"),
translate(
"AddonsInstaller",
"Could not find git executable: cannot change branch",
),
QtWidgets.QMessageBox.Ok,
QtWidgets.QMessageBox.Ok,
)
def _show_git_failed_dialog(self):
QtWidgets.QMessageBox.critical(
self,
translate("AddonsInstaller", "git operation failed"),
translate(
"AddonsInstaller",
"Git returned an error code when attempting to change branch. There may be "
"more details in the Report View.",
),
QtWidgets.QMessageBox.Ok,
QtWidgets.QMessageBox.Ok,
)
class ChangeBranchDialogModel(QtCore.QAbstractTableModel):
@@ -235,11 +281,11 @@ class ChangeBranchDialogModel(QtCore.QAbstractTableModel):
class ChangeBranchDialogFilter(QtCore.QSortFilterProxyModel):
def lessThan(self, left: QtCore.QModelIndex, right: QtCore.QModelIndex):
leftData = self.sourceModel().data(left, ChangeBranchDialogModel.DataSortRole)
rightData = self.sourceModel().data(right, ChangeBranchDialogModel.DataSortRole)
if leftData is None or rightData is None:
if rightData is not None:
left_data = self.sourceModel().data(left, ChangeBranchDialogModel.DataSortRole)
right_data = self.sourceModel().data(right, ChangeBranchDialogModel.DataSortRole)
if left_data is None or right_data is None:
if right_data is not None:
return True
else:
return False
return leftData < rightData
return left_data < right_data