Arch: recoded Git tool - fixes #2599
This commit is contained in:
parent
fa315d2553
commit
09e9c8966f
|
@ -54,7 +54,7 @@ class _CommandBimserver:
|
||||||
try:
|
try:
|
||||||
import requests
|
import requests
|
||||||
except:
|
except:
|
||||||
FreeCAD.Console.PrintError("requests python module not found, aborting.\n")
|
FreeCAD.Console.PrintError(translate("Arch","requests python module not found, aborting. Please install python-requests\n"))
|
||||||
else:
|
else:
|
||||||
FreeCADGui.Control.showDialog(_BimServerTaskPanel())
|
FreeCADGui.Control.showDialog(_BimServerTaskPanel())
|
||||||
|
|
||||||
|
@ -87,7 +87,6 @@ class _BimServerTaskPanel:
|
||||||
return int(QtGui.QDialogButtonBox.Close)
|
return int(QtGui.QDialogButtonBox.Close)
|
||||||
|
|
||||||
def accept(self):
|
def accept(self):
|
||||||
FreeCADGui.Selection.removeObserver(self.observer)
|
|
||||||
FreeCADGui.Control.closeDialog()
|
FreeCADGui.Control.closeDialog()
|
||||||
|
|
||||||
def getPrefs(self):
|
def getPrefs(self):
|
||||||
|
@ -135,8 +134,8 @@ class _BimServerTaskPanel:
|
||||||
try:
|
try:
|
||||||
resp = requests.post(url2,json = data)
|
resp = requests.post(url2,json = data)
|
||||||
except:
|
except:
|
||||||
FreeCAD.Console.PrintError("Unable to connect to BimServer at "+url+"\n")
|
FreeCAD.Console.PrintError(translate("Arch","Unable to connect to BimServer at")+" "+url+"\n")
|
||||||
self.form.labelStatus.setText("Connection failed.")
|
self.form.labelStatus.setText(translate("Arch","Connection failed."))
|
||||||
return
|
return
|
||||||
if resp.ok:
|
if resp.ok:
|
||||||
try:
|
try:
|
||||||
|
@ -170,14 +169,14 @@ class _BimServerTaskPanel:
|
||||||
import requests
|
import requests
|
||||||
url,token = self.getPrefs()
|
url,token = self.getPrefs()
|
||||||
if url and token:
|
if url and token:
|
||||||
self.form.labelStatus.setText("Getting projects list...")
|
self.form.labelStatus.setText(translate("Arch","Getting projects list..."))
|
||||||
url += "/json"
|
url += "/json"
|
||||||
data = { "token": token, "request": { "interface": "SettingsInterface", "method": "getServerSettings", "parameters": { } } }
|
data = { "token": token, "request": { "interface": "SettingsInterface", "method": "getServerSettings", "parameters": { } } }
|
||||||
try:
|
try:
|
||||||
resp = requests.post(url,json = data)
|
resp = requests.post(url,json = data)
|
||||||
except:
|
except:
|
||||||
FreeCAD.Console.PrintError("Unable to connect to BimServer at "+url[:-5]+"\n")
|
FreeCAD.Console.PrintError(translate("Arch","Unable to connect to BimServer at")+" "+url[:-5]+"\n")
|
||||||
self.form.labelStatus.setText("Connection failed.")
|
self.form.labelStatus.setText(translate("Arch","Connection failed."))
|
||||||
return
|
return
|
||||||
if resp.ok:
|
if resp.ok:
|
||||||
try:
|
try:
|
||||||
|
@ -192,7 +191,7 @@ class _BimServerTaskPanel:
|
||||||
try:
|
try:
|
||||||
projects = resp.json()["response"]["result"]
|
projects = resp.json()["response"]["result"]
|
||||||
except:
|
except:
|
||||||
FreeCAD.Console.PrintError("Unable to get projects list from BimServer\n")
|
FreeCAD.Console.PrintError(translate("Arch","Unable to get projects list from BimServer\n"))
|
||||||
else:
|
else:
|
||||||
self.setLogged(True)
|
self.setLogged(True)
|
||||||
self.form.comboProjects.clear()
|
self.form.comboProjects.clear()
|
||||||
|
@ -213,7 +212,7 @@ class _BimServerTaskPanel:
|
||||||
url += "/json"
|
url += "/json"
|
||||||
if (index >= 0) and (len(self.Projects) > index):
|
if (index >= 0) and (len(self.Projects) > index):
|
||||||
p = self.Projects[index]
|
p = self.Projects[index]
|
||||||
self.form.labelStatus.setText("Getting revisions...")
|
self.form.labelStatus.setText(translate("Arch","Getting revisions..."))
|
||||||
for rev in p["revisions"]:
|
for rev in p["revisions"]:
|
||||||
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "getRevision", "parameters": { "roid": rev } } }
|
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "getRevision", "parameters": { "roid": rev } } }
|
||||||
resp = requests.post(url,json = data)
|
resp = requests.post(url,json = data)
|
||||||
|
@ -236,8 +235,8 @@ class _BimServerTaskPanel:
|
||||||
import requests
|
import requests
|
||||||
url,token = self.getPrefs()
|
url,token = self.getPrefs()
|
||||||
if url and token:
|
if url and token:
|
||||||
FreeCAD.Console.PrintMessage("Downloading file from Bimserver...\n")
|
FreeCAD.Console.PrintMessage(translate("Arch","Downloading file from Bimserver...\n"))
|
||||||
self.form.labelStatus.setText("Checking available serializers...")
|
self.form.labelStatus.setText(translate("Arch","Checking available serializers..."))
|
||||||
url += "/json"
|
url += "/json"
|
||||||
serializer = None
|
serializer = None
|
||||||
for s in ["Ifc2x3tc1"]: # Ifc4 seems unreliable ATM, let's stick with good old Ifc2x3...
|
for s in ["Ifc2x3tc1"]: # Ifc4 seems unreliable ATM, let's stick with good old Ifc2x3...
|
||||||
|
@ -252,19 +251,19 @@ class _BimServerTaskPanel:
|
||||||
serializer = srl
|
serializer = srl
|
||||||
break
|
break
|
||||||
if not serializer:
|
if not serializer:
|
||||||
FreeCAD.Console.PrintError("Unable to get a valid serializer from the BimServer\n")
|
FreeCAD.Console.PrintError(translate("Arch","Unable to get a valid serializer from the BimServer\n"))
|
||||||
return
|
return
|
||||||
tf = QtGui.QFileDialog.getSaveFileName(QtGui.qApp.activeWindow(), "Save the downloaded IFC file?", None, "IFC files (*.ifc)")
|
tf = QtGui.QFileDialog.getSaveFileName(QtGui.qApp.activeWindow(), "Save the downloaded IFC file?", None, "IFC files (*.ifc)")
|
||||||
if tf:
|
if tf:
|
||||||
tf = tf[0]
|
tf = tf[0]
|
||||||
self.form.labelStatus.setText("Downloading file...")
|
self.form.labelStatus.setText(translate("Arch","Downloading file..."))
|
||||||
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "downloadRevisions", "parameters": { "roids": [rev["oid"]], "serializerOid": serializer["oid"], "sync": "false" } } }
|
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "downloadRevisions", "parameters": { "roids": [rev["oid"]], "serializerOid": serializer["oid"], "sync": "false" } } }
|
||||||
resp = requests.post(url,json = data)
|
resp = requests.post(url,json = data)
|
||||||
if resp.ok:
|
if resp.ok:
|
||||||
try:
|
try:
|
||||||
downloadid = resp.json()["response"]["result"]
|
downloadid = resp.json()["response"]["result"]
|
||||||
except:
|
except:
|
||||||
FreeCAD.Console.PrintError("Unable to obtain a valid download for this revision from the BimServer\n")
|
FreeCAD.Console.PrintError(translate("Arch","Unable to obtain a valid download for this revision from the BimServer\n"))
|
||||||
return
|
return
|
||||||
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "getDownloadData", "parameters": { "topicId": downloadid } } }
|
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "getDownloadData", "parameters": { "topicId": downloadid } } }
|
||||||
resp = requests.post(url,json = data)
|
resp = requests.post(url,json = data)
|
||||||
|
@ -272,11 +271,11 @@ class _BimServerTaskPanel:
|
||||||
try:
|
try:
|
||||||
downloaddata = resp.json()["response"]["result"]["file"]
|
downloaddata = resp.json()["response"]["result"]["file"]
|
||||||
except:
|
except:
|
||||||
FreeCAD.Console.PrintError("Unable to download the data for this revision.\n")
|
FreeCAD.Console.PrintError(translate("Arch","Unable to download the data for this revision.\n"))
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
FreeCAD.Console.PrintMessage("Opening file...\n")
|
FreeCAD.Console.PrintMessage(translate("Arch","Opening file...\n"))
|
||||||
self.form.labelStatus.setText("Opening file...")
|
self.form.labelStatus.setText(translate("Arch","Opening file..."))
|
||||||
if not tf:
|
if not tf:
|
||||||
tf = tempfile.mkstemp(suffix=".ifc")[1]
|
tf = tempfile.mkstemp(suffix=".ifc")[1]
|
||||||
f = open(tf,"wb")
|
f = open(tf,"wb")
|
||||||
|
@ -295,8 +294,8 @@ class _BimServerTaskPanel:
|
||||||
if url and token:
|
if url and token:
|
||||||
url += "/json"
|
url += "/json"
|
||||||
deserializer = None
|
deserializer = None
|
||||||
FreeCAD.Console.PrintMessage("Saving file...\n")
|
FreeCAD.Console.PrintMessage(translate("Arch","Saving file...\n"))
|
||||||
self.form.labelStatus.setText("Checking available deserializers...")
|
self.form.labelStatus.setText(translate("Arch","Checking available deserializers..."))
|
||||||
import ifcopenshell
|
import ifcopenshell
|
||||||
schema = ifcopenshell.schema_identifier.lower()
|
schema = ifcopenshell.schema_identifier.lower()
|
||||||
data = { "token": token, "request": { "interface": "PluginInterface", "method": "getAllDeserializers", "parameters": { "onlyEnabled": "true" } } }
|
data = { "token": token, "request": { "interface": "PluginInterface", "method": "getAllDeserializers", "parameters": { "onlyEnabled": "true" } } }
|
||||||
|
@ -310,143 +309,170 @@ class _BimServerTaskPanel:
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if not deserializer:
|
if not deserializer:
|
||||||
FreeCAD.Console.PrintError("Unable to get a valid deserializer for the "+schema+" schema\n")
|
FreeCAD.Console.PrintError(translate("Arch","Unable to get a valid deserializer for the schema")+" "+schema+"\n")
|
||||||
return
|
return
|
||||||
tf = QtGui.QFileDialog.getSaveFileName(QtGui.qApp.activeWindow(), "Save the IFC file before uploading?", None, "IFC files (*.ifc)")
|
tf = QtGui.QFileDialog.getSaveFileName(QtGui.qApp.activeWindow(), translate("Arch","Save the IFC file before uploading?"), None, translate("Arch","IFC files (*.ifc)"))
|
||||||
if tf:
|
if tf:
|
||||||
tf = tf[0]
|
tf = tf[0]
|
||||||
if not tf:
|
if not tf:
|
||||||
tf = os.path.join(tempfile._get_default_tempdir(),next(tempfile._get_candidate_names())+".ifc")
|
tf = os.path.join(tempfile._get_default_tempdir(),next(tempfile._get_candidate_names())+".ifc")
|
||||||
import importIFC
|
import importIFC
|
||||||
self.form.labelStatus.setText("Saving file...")
|
self.form.labelStatus.setText(translate("Arch","Saving file..."))
|
||||||
importIFC.export([self.RootObjects[self.form.comboRoot.currentIndex()]],tf)
|
importIFC.export([self.RootObjects[self.form.comboRoot.currentIndex()]],tf)
|
||||||
f = open(tf,"rb")
|
f = open(tf,"rb")
|
||||||
ifcdata = base64.b64encode(f.read())
|
ifcdata = base64.b64encode(f.read())
|
||||||
f.close()
|
f.close()
|
||||||
FreeCAD.Console.PrintMessage("Uploading file to Bimserver...\n")
|
FreeCAD.Console.PrintMessage(translate("Arch","Uploading file to Bimserver...\n"))
|
||||||
self.form.labelStatus.setText("Uploading file...")
|
self.form.labelStatus.setText(translate("Arch","Uploading file..."))
|
||||||
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "checkin", "parameters": { "poid": project["oid"], "comment": self.form.editComment.text(), "deserializerOid": deserializer["oid"], "fileSize": os.path.getsize(tf), "fileName": os.path.basename(tf), "data": ifcdata, "merge": "false", "sync": "true" } } }
|
data = { "token": token, "request": { "interface": "ServiceInterface", "method": "checkin", "parameters": { "poid": project["oid"], "comment": self.form.editComment.text(), "deserializerOid": deserializer["oid"], "fileSize": os.path.getsize(tf), "fileName": os.path.basename(tf), "data": ifcdata, "merge": "false", "sync": "true" } } }
|
||||||
resp = requests.post(url,json = data)
|
resp = requests.post(url,json = data)
|
||||||
if resp.ok:
|
if resp.ok:
|
||||||
if resp.json()["response"]["result"]:
|
if resp.json()["response"]["result"]:
|
||||||
FreeCAD.Console.PrintMessage("File upload successful\n")
|
FreeCAD.Console.PrintMessage(translate("Arch","File upload successful\n"))
|
||||||
self.getRevisions(self.form.comboProjects.currentIndex())
|
self.getRevisions(self.form.comboProjects.currentIndex())
|
||||||
else:
|
else:
|
||||||
FreeCAD.Console.PrintError("File upload failed\n")
|
FreeCAD.Console.PrintError(translate("Arch","File upload failed\n"))
|
||||||
self.form.labelStatus.setText("")
|
self.form.labelStatus.setText("")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# GIT ###########################################################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class _CommandGit:
|
class _CommandGit:
|
||||||
"the Arch Git Commit command definition"
|
"the Arch Git Commit command definition"
|
||||||
def GetResources(self):
|
def GetResources(self):
|
||||||
return {'Pixmap' : 'Git',
|
return {'Pixmap' : 'Git',
|
||||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Git","Commit with Git"),
|
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Git","Git"),
|
||||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Git","Commits the current document")}
|
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Git","Manages the current document with Git")}
|
||||||
|
|
||||||
def Activated(self):
|
def Activated(self):
|
||||||
f = FreeCAD.ActiveDocument.FileName
|
f = FreeCAD.ActiveDocument.FileName
|
||||||
if not f:
|
if not f:
|
||||||
FreeCAD.Console.PrintError(translate("Arch","This document is not saved. Please save it first"))
|
FreeCAD.Console.PrintError(translate("Arch","This document is not saved. Please save it first.\n"))
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
import git
|
import git
|
||||||
except:
|
except:
|
||||||
FreeCAD.Console.PrintError(translate("Arch","The Python Git module was not found. Please install the python-git package."))
|
FreeCAD.Console.PrintError(translate("Arch","The Python Git module was not found. Please install the python-git package.\n"))
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
repo = git.Repo(os.path.dirname(f))
|
repo = git.Repo(os.path.dirname(f))
|
||||||
except:
|
except:
|
||||||
FreeCAD.Console.PrintError(translate("Arch","This document doesn't appear to be part of a Git repository."))
|
FreeCAD.Console.PrintError(translate("Arch","This document doesn't appear to be part of a Git repository.\n"))
|
||||||
return
|
return
|
||||||
pushOK = True
|
|
||||||
if not repo.remotes:
|
|
||||||
FreeCAD.Console.PrintWarning(translate("Arch","Warning: no remote repositories. Unable to push"))
|
|
||||||
pushOK = False
|
|
||||||
modified_files = repo.git.diff("--name-only").split()
|
|
||||||
untracked_files = repo.git.ls_files("--other","--exclude-standard").split()
|
|
||||||
if not os.path.basename(f) in modified_files:
|
|
||||||
if not os.path.basename(f) in untracked_files:
|
|
||||||
FreeCAD.Console.PrintError(translate("Arch","The Git repository cannot handle this document."))
|
|
||||||
return
|
|
||||||
|
|
||||||
d = _ArchGitDialog()
|
|
||||||
if not pushOK:
|
|
||||||
d.checkBox.setChecked(False)
|
|
||||||
d.checkBox.setEnabled(False)
|
|
||||||
d.label.setText(str(len(modified_files)+len(untracked_files))+" modified file(s)")
|
|
||||||
d.lineEdit.setText("Changed " + os.path.basename(f))
|
|
||||||
r = d.exec_()
|
|
||||||
if r:
|
|
||||||
if d.radioButton_2.isChecked():
|
|
||||||
for o in modified_files + untracked_files:
|
|
||||||
repo.git.add(o)
|
|
||||||
else:
|
else:
|
||||||
repo.git.add(os.path.basename(f))
|
FreeCADGui.Control.showDialog(_GitTaskPanel(repo))
|
||||||
repo.git.commit(m=d.lineEdit.text())
|
|
||||||
if d.checkBox.isChecked():
|
|
||||||
repo.git.push()
|
|
||||||
|
|
||||||
|
|
||||||
|
class _GitTaskPanel:
|
||||||
|
|
||||||
|
'''The TaskPanel for the Git command'''
|
||||||
|
|
||||||
|
def __init__(self,repo):
|
||||||
|
self.form = FreeCADGui.PySideUic.loadUi(":/ui/GitTaskPanel.ui")
|
||||||
|
self.form.setWindowIcon(QtGui.QIcon(":/icons/Git.svg"))
|
||||||
|
self.form.labelStatus.setText("")
|
||||||
|
QtCore.QObject.connect(self.form.buttonRefresh, QtCore.SIGNAL("clicked()"), self.getFiles)
|
||||||
|
QtCore.QObject.connect(self.form.buttonLog, QtCore.SIGNAL("clicked()"), self.getLog)
|
||||||
|
QtCore.QObject.connect(self.form.buttonSelectAll, QtCore.SIGNAL("clicked()"), self.form.listFiles.selectAll)
|
||||||
|
QtCore.QObject.connect(self.form.buttonDiff, QtCore.SIGNAL("clicked()"), self.getDiff)
|
||||||
|
QtCore.QObject.connect(self.form.buttonCommit, QtCore.SIGNAL("clicked()"), self.commit)
|
||||||
|
QtCore.QObject.connect(self.form.buttonPush, QtCore.SIGNAL("clicked()"), self.push)
|
||||||
|
QtCore.QObject.connect(self.form.buttonPull, QtCore.SIGNAL("clicked()"), self.pull)
|
||||||
|
self.repo = repo
|
||||||
|
self.getRemotes()
|
||||||
|
self.getFiles()
|
||||||
|
|
||||||
class _ArchGitDialog(QtGui.QDialog):
|
def getStandardButtons(self):
|
||||||
def __init__(self):
|
return int(QtGui.QDialogButtonBox.Close)
|
||||||
QtGui.QDialog.__init__(self)
|
|
||||||
self.setObjectName("ArchGitOptions")
|
|
||||||
self.resize(370, 200)
|
|
||||||
self.verticalLayout = QtGui.QVBoxLayout(self)
|
|
||||||
self.verticalLayout.setObjectName("verticalLayout")
|
|
||||||
self.groupBox = QtGui.QGroupBox(self)
|
|
||||||
self.groupBox.setObjectName("groupBox")
|
|
||||||
self.vl3 = QtGui.QVBoxLayout(self.groupBox)
|
|
||||||
self.vl3.setObjectName("vl3")
|
|
||||||
self.label = QtGui.QLabel(self.groupBox)
|
|
||||||
self.label.setObjectName("label")
|
|
||||||
self.vl3.addWidget(self.label)
|
|
||||||
self.horizontalLayout = QtGui.QHBoxLayout()
|
|
||||||
self.vl3.addLayout(self.horizontalLayout)
|
|
||||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
|
||||||
self.radioButton_2 = QtGui.QRadioButton(self.groupBox)
|
|
||||||
self.radioButton_2.setChecked(True)
|
|
||||||
self.radioButton_2.setObjectName("radioButton_2")
|
|
||||||
self.horizontalLayout.addWidget(self.radioButton_2)
|
|
||||||
self.radioButton = QtGui.QRadioButton(self.groupBox)
|
|
||||||
self.radioButton.setObjectName("radioButton")
|
|
||||||
self.horizontalLayout.addWidget(self.radioButton)
|
|
||||||
self.verticalLayout.addWidget(self.groupBox)
|
|
||||||
self.groupBox_2 = QtGui.QGroupBox(self)
|
|
||||||
self.groupBox_2.setObjectName("groupBox_2")
|
|
||||||
self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox_2)
|
|
||||||
self.verticalLayout_2.setObjectName("horizontalLayout_2")
|
|
||||||
self.lineEdit = QtGui.QLineEdit(self.groupBox_2)
|
|
||||||
self.lineEdit.setObjectName("lineEdit")
|
|
||||||
self.verticalLayout_2.addWidget(self.lineEdit)
|
|
||||||
self.checkBox = QtGui.QCheckBox(self.groupBox_2)
|
|
||||||
self.checkBox.setChecked(True)
|
|
||||||
self.checkBox.setObjectName("checkBox")
|
|
||||||
self.verticalLayout_2.addWidget(self.checkBox)
|
|
||||||
self.verticalLayout.addWidget(self.groupBox_2)
|
|
||||||
self.buttonBox = QtGui.QDialogButtonBox(self)
|
|
||||||
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
|
|
||||||
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
|
|
||||||
self.buttonBox.setObjectName("buttonBox")
|
|
||||||
self.verticalLayout.addWidget(self.buttonBox)
|
|
||||||
|
|
||||||
self.retranslateUi()
|
def accept(self):
|
||||||
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.accept)
|
FreeCADGui.Control.closeDialog()
|
||||||
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), self.reject)
|
|
||||||
QtCore.QMetaObject.connectSlotsByName(self)
|
|
||||||
|
|
||||||
def retranslateUi(self):
|
def getFiles(self):
|
||||||
self.setWindowTitle(QtGui.QApplication.translate("ArchGitOptions", "Git Options", None, QtGui.QApplication.UnicodeUTF8))
|
self.form.labelStatus.setText("")
|
||||||
self.groupBox.setTitle(QtGui.QApplication.translate("ArchGitOptions", "What to commit", None, QtGui.QApplication.UnicodeUTF8))
|
self.form.listFiles.clear()
|
||||||
self.radioButton_2.setText(QtGui.QApplication.translate("ArchGitOptions", "All files in folder", None, QtGui.QApplication.UnicodeUTF8))
|
self.modified = self.repo.git.diff("--name-only").split()
|
||||||
self.radioButton.setText(QtGui.QApplication.translate("ArchGitOptions", "Only this .FcStd file", None, QtGui.QApplication.UnicodeUTF8))
|
self.untracked = self.repo.git.ls_files("--other","--exclude-standard").split()
|
||||||
self.groupBox_2.setTitle(QtGui.QApplication.translate("ArchGitOptions", "Commit message", None, QtGui.QApplication.UnicodeUTF8))
|
for f in self.modified:
|
||||||
self.lineEdit.setText(QtGui.QApplication.translate("ArchGitOptions", "commit", None, QtGui.QApplication.UnicodeUTF8))
|
self.form.listFiles.addItem(f)
|
||||||
self.checkBox.setText(QtGui.QApplication.translate("ArchGitOptions", "Push to default remote repository", None, QtGui.QApplication.UnicodeUTF8))
|
for f in self.untracked:
|
||||||
|
self.form.listFiles.addItem(f+" *")
|
||||||
|
self.form.labelStatus.setText(translate("Arch","Branch")+": "+self.repo.active_branch.name)
|
||||||
|
|
||||||
|
def getLog(self):
|
||||||
|
textform = FreeCADGui.PySideUic.loadUi(":/ui/DialogDisplayText.ui")
|
||||||
|
textform.setWindowTitle("Git log")
|
||||||
|
textform.browserText.setPlainText(self.repo.git.log())
|
||||||
|
textform.exec_()
|
||||||
|
|
||||||
|
def getDiff(self):
|
||||||
|
if (self.form.listFiles.currentRow() >= 0):
|
||||||
|
f = (self.modified+self.untracked)[self.form.listFiles.currentRow()]
|
||||||
|
textform = FreeCADGui.PySideUic.loadUi(":/ui/DialogDisplayText.ui")
|
||||||
|
textform.setWindowTitle("Diff: "+f)
|
||||||
|
textform.browserText.setPlainText(self.repo.git.diff(f))
|
||||||
|
textform.exec_()
|
||||||
|
|
||||||
|
def getRemotes(self):
|
||||||
|
self.form.listRepos.clear()
|
||||||
|
if self.repo.remotes:
|
||||||
|
for r in self.repo.remotes:
|
||||||
|
self.form.listRepos.addItem(r.name+": "+r.url)
|
||||||
|
else:
|
||||||
|
FreeCAD.Console.PrintWarning(translate("Arch","Warning: no remote repositories.\n"))
|
||||||
|
|
||||||
|
def commit(self):
|
||||||
|
if not self.form.listFiles.selectedItems():
|
||||||
|
FreeCAD.Console.PrintError(translate("Arch","Please select file(s) to commit.\n"))
|
||||||
|
self.form.labelStatus.setText(translate("Arch","No file selected"))
|
||||||
|
return
|
||||||
|
if not self.form.editMessage.text():
|
||||||
|
FreeCAD.Console.PrintError(translate("Arch","Please write a commit message.\n"))
|
||||||
|
self.form.labelStatus.setText(translate("Arch","No commit message"))
|
||||||
|
return
|
||||||
|
for it in self.form.listFiles.selectedItems():
|
||||||
|
f = it.text()
|
||||||
|
if f[-2:] == " *":
|
||||||
|
f = f[:-2]
|
||||||
|
self.repo.git.add(f)
|
||||||
|
s = self.repo.git.commit(m=self.form.editMessage.text())
|
||||||
|
FreeCAD.Console.PrintMessage(translate("Arch","Successfully committed %i files.\n") % len(self.form.listFiles.selectedItems()))
|
||||||
|
self.form.labelStatus.setText(translate("Arch","Files committed."))
|
||||||
|
if s:
|
||||||
|
FreeCAD.Console.PrintMessage(s+"\n")
|
||||||
|
self.getFiles()
|
||||||
|
|
||||||
|
def push(self):
|
||||||
|
if len(self.form.listRepos.selectedItems()) != 1:
|
||||||
|
FreeCAD.Console.PrintError(translate("Arch","Please select a repo to push to.\n"))
|
||||||
|
self.form.labelStatus.setText(translate("Arch","No repo selected"))
|
||||||
|
return
|
||||||
|
self.form.labelStatus.setText(translate("Arch","Pushing files..."))
|
||||||
|
r = self.form.listRepos.selectedItems()[0].text().split(":")[0]
|
||||||
|
s = self.repo.git.push(r)
|
||||||
|
FreeCAD.Console.PrintMessage(translate("Arch","Successfully pushed to")+" "+r+"\n")
|
||||||
|
self.form.labelStatus.setText(translate("Arch","Files pushed."))
|
||||||
|
if s:
|
||||||
|
FreeCAD.Console.PrintMessage(s+"\n")
|
||||||
|
self.getFiles()
|
||||||
|
|
||||||
|
def pull(self):
|
||||||
|
if len(self.form.listRepos.selectedItems()) != 1:
|
||||||
|
FreeCAD.Console.PrintError(translate("Arch","Please select a repo to pull from.\n"))
|
||||||
|
self.form.labelStatus.setText(translate("Arch","No repo selected"))
|
||||||
|
return
|
||||||
|
self.form.labelStatus.setText(translate("Arch","Pulling files..."))
|
||||||
|
r = self.form.listRepos.selectedItems()[0].text().split(":")[0]
|
||||||
|
s = self.repo.git.pull(r)
|
||||||
|
FreeCAD.Console.PrintMessage(translate("Arch","Successfully pulled from")+" "+r+"\n")
|
||||||
|
self.form.labelStatus.setText(translate("Arch","Files pulled."))
|
||||||
|
if s:
|
||||||
|
FreeCAD.Console.PrintMessage(s+"\n")
|
||||||
|
if os.path.basename(FreeCAD.ActiveDocument.FileName) in s:
|
||||||
|
FreeCAD.Console.PrintWarning(translate("Arch","Warning: the current document file has been changed by this pull. Please save your document to keep your changes.\n"))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -505,6 +505,7 @@ class _ViewProviderStructure(ArchComponent.ViewProviderComponent):
|
||||||
def getIcon(self):
|
def getIcon(self):
|
||||||
import Arch_rc
|
import Arch_rc
|
||||||
if hasattr(self,"Object"):
|
if hasattr(self,"Object"):
|
||||||
|
if hasattr(self.Object,"CloneOf"):
|
||||||
if self.Object.CloneOf:
|
if self.Object.CloneOf:
|
||||||
return ":/icons/Arch_Structure_Clone.svg"
|
return ":/icons/Arch_Structure_Clone.svg"
|
||||||
return ":/icons/Arch_Structure_Tree.svg"
|
return ":/icons/Arch_Structure_Tree.svg"
|
||||||
|
|
|
@ -80,6 +80,7 @@
|
||||||
<file>ui/BimServerTaskPanel.ui</file>
|
<file>ui/BimServerTaskPanel.ui</file>
|
||||||
<file>ui/GitTaskPanel.ui</file>
|
<file>ui/GitTaskPanel.ui</file>
|
||||||
<file>ui/DialogBimServerLogin.ui</file>
|
<file>ui/DialogBimServerLogin.ui</file>
|
||||||
|
<file>ui/DialogDisplayText.ui</file>
|
||||||
<file>translations/Arch_af.qm</file>
|
<file>translations/Arch_af.qm</file>
|
||||||
<file>translations/Arch_de.qm</file>
|
<file>translations/Arch_de.qm</file>
|
||||||
<file>translations/Arch_fi.qm</file>
|
<file>translations/Arch_fi.qm</file>
|
||||||
|
|
67
src/Mod/Arch/Resources/ui/DialogDisplayText.ui
Normal file
67
src/Mod/Arch/Resources/ui/DialogDisplayText.ui
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Dialog</class>
|
||||||
|
<widget class="QDialog" name="Dialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>372</width>
|
||||||
|
<height>286</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Dialog</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QTextBrowser" name="browserText"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Close</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>Dialog</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>248</x>
|
||||||
|
<y>254</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>Dialog</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>316</x>
|
||||||
|
<y>260</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
|
@ -6,12 +6,12 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>228</width>
|
<width>255</width>
|
||||||
<height>494</height>
|
<height>516</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Git</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
|
@ -21,53 +21,9 @@
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="labelWarning">
|
<widget class="QLabel" name="labelStatus">
|
||||||
<property name="palette">
|
|
||||||
<palette>
|
|
||||||
<active>
|
|
||||||
<colorrole role="WindowText">
|
|
||||||
<brush brushstyle="SolidPattern">
|
|
||||||
<color alpha="255">
|
|
||||||
<red>255</red>
|
|
||||||
<green>0</green>
|
|
||||||
<blue>0</blue>
|
|
||||||
</color>
|
|
||||||
</brush>
|
|
||||||
</colorrole>
|
|
||||||
</active>
|
|
||||||
<inactive>
|
|
||||||
<colorrole role="WindowText">
|
|
||||||
<brush brushstyle="SolidPattern">
|
|
||||||
<color alpha="255">
|
|
||||||
<red>255</red>
|
|
||||||
<green>0</green>
|
|
||||||
<blue>0</blue>
|
|
||||||
</color>
|
|
||||||
</brush>
|
|
||||||
</colorrole>
|
|
||||||
</inactive>
|
|
||||||
<disabled>
|
|
||||||
<colorrole role="WindowText">
|
|
||||||
<brush brushstyle="SolidPattern">
|
|
||||||
<color alpha="255">
|
|
||||||
<red>103</red>
|
|
||||||
<green>103</green>
|
|
||||||
<blue>103</blue>
|
|
||||||
</color>
|
|
||||||
</brush>
|
|
||||||
</colorrole>
|
|
||||||
</disabled>
|
|
||||||
</palette>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Warning</string>
|
<string/>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>List of files to be committed:</string>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -103,7 +59,18 @@
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QListWidget" name="listFiles"/>
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>List of files to be committed:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="listFiles">
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::MultiSelection</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
@ -120,6 +87,13 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="buttonDiff">
|
||||||
|
<property name="text">
|
||||||
|
<string>Diff</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="buttonSelectAll">
|
<widget class="QPushButton" name="buttonSelectAll">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
|
|
Loading…
Reference in New Issue
Block a user