def testOsmMapping(self): repoPath = self.getTempRepoPath() repo = Repository(repoPath, init = True) osmfile = os.path.join(os.path.dirname(__file__), "data", "osm", "ways.xml") mappingfile = os.path.join(os.path.dirname(__file__), "data", "osm", "mapping.json") repo.importosm(osmfile) repo.add() repo.commit("message") repo.maposm(mappingfile) feature = Feature(repo, geogig.WORK_HEAD, "onewaystreets/31045880") self.assertTrue(feature.exists())
def testLargeHistory(self): NUMPOINTS = 6000 repo = Repository(self.getTempRepoPath(), init=True) path = os.path.join(os.path.dirname(__file__), "data", "shp", "elevation", "elevation.shp") repo.importshp(path) repo.add() for i in xrange(NUMPOINTS): feature = "elevation/" + str(i + 1) message = "message " + str(i + 1) repo.commit(message, [feature]) log = repo.log()
class Git: """ TODO::write some docs """ def __init__(self, owner): self.geogig_dir = settings.GEOGIG_REPO+'/'+str(owner.id) if not os.path.exists(self.geogig_dir): #create repo self.repo = Repository(self.geogig_dir, init=True) self.repo.config(geogig.USER_NAME, owner.username) self.repo.config(geogig.USER_EMAIL, owner.email) else: #use existing repo self.repo = Repository(self.geogig_dir, init=False) def push(self, shp=None, commit_msg=None): """ import (may take some time!) and commit uploaded shape file in repo """ self.repo.importshp(shp) self.repo.add() self.repo.commit(message=commit_msg) def log(self): """ log """ log = self.repo.log() list_info = [] for l in log: info = { 'id': l.id, 'date': l.committerprettydate(), 'msg': l.message } list_info.append(info) return list_info
class Git: """ TODO::write some docs """ def __init__(self, owner): self.geogig_dir = settings.GEOGIG_REPO + "/" + str(owner.id) if not os.path.exists(self.geogig_dir): # create repo self.repo = Repository(self.geogig_dir, init=True) self.repo.config(geogig.USER_NAME, owner.username) self.repo.config(geogig.USER_EMAIL, owner.email) else: # use existing repo self.repo = Repository(self.geogig_dir, init=False) def push(self, shp=None, commit_msg=None): """ import (may take some time!) and commit uploaded shape file in repo """ self.repo.importshp(shp) self.repo.add() self.repo.commit(message=commit_msg) def log(self): """ log """ log = self.repo.log() list_info = [] for l in log: info = {"id": l.id, "date": l.committerprettydate(), "msg": l.message} list_info.append(info) return list_info
class ImportDialog(QtGui.QDialog): def __init__(self, parent, repo=None, layer=None): super(ImportDialog, self).__init__(parent) self.repo = repo self.layer = layer self.ok = False self.initGui() def initGui(self): self.setWindowTitle('Add layer to GeoGig repository') verticalLayout = QtGui.QVBoxLayout() if self.repo is None: repos = localRepos() self.repos = {r.title: r.path for r in repos} layerLabel = QtGui.QLabel('Repository') verticalLayout.addWidget(layerLabel) self.repoCombo = QtGui.QComboBox() self.repoCombo.addItems(self.repos.keys()) verticalLayout.addWidget(self.repoCombo) if self.layer is None: layerLabel = QtGui.QLabel('Layer') verticalLayout.addWidget(layerLabel) self.layerCombo = QtGui.QComboBox() layerNames = [ layer.name() for layer in getVectorLayers() if layer.source().lower().endswith("shp") and not isTracked(layer) ] self.layerCombo.addItems(layerNames) verticalLayout.addWidget(self.layerCombo) messageLabel = QtGui.QLabel('Message to describe this update') verticalLayout.addWidget(messageLabel) self.messageBox = QtGui.QPlainTextEdit() self.messageBox.textChanged.connect(self.messageHasChanged) verticalLayout.addWidget(self.messageBox) self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Cancel) self.importButton = QtGui.QPushButton("Add layer") self.importButton.clicked.connect(self.importClicked) self.importButton.setEnabled(False) self.buttonBox.addButton(self.importButton, QtGui.QDialogButtonBox.ApplyRole) self.buttonBox.rejected.connect(self.cancelPressed) verticalLayout.addWidget(self.buttonBox) self.setLayout(verticalLayout) self.resize(400, 200) def messageHasChanged(self): self.importButton.setEnabled(self.messageBox.toPlainText() != "") def importClicked(self): if self.repo is None: connector = PyQtConnectorDecorator() connector.checkIsAlive() self.repo = Repository(self.repos[self.repoCombo.currentText()], connector) if self.layer is None: text = self.layerCombo.currentText() self.layer = resolveLayer(text) source = self.layer.source() hasIdField = self.layer.dataProvider().fieldNameIndex("geogigid") != -1 if not hasIdField: autoAddId = config.getConfigValue(config.GENERAL, config.AUTO_ADD_ID) if not autoAddId: dlg = AddGeogigIdDialog(self) ok, check = dlg.exec_() if ok == QtGui.QMessageBox.No: self.close() return if check: config.setConfigValue(config.GENERAL, config.AUTO_ADD_ID, True) QtGui.QApplication.setOverrideCursor( QtGui.QCursor(QtCore.Qt.WaitCursor)) addIdField(self.layer) QtGui.QApplication.restoreOverrideCursor() hasIdField = self.layer.dataProvider().fieldNameIndex( "geogigid") != -1 if not hasIdField: QtGui.QMessageBox.warning( self, "Error", "Could not add 'geogigid' field to layer.\n" "Possible causes for this are:\n" "- No permission to edit the layer.\n", QtGui.QMessageBox.Ok, QtGui.QMessageBox.Ok) return # determine encoding # first look in .cpg file cpgPath = source.replace('.shp', '.cpg') if os.path.exists(cpgPath): with open(cpgPath) as f: charset = f.readline().strip('\r\n') else: # try to get encoding from provider charset = self.layer.dataProvider().encoding() if charset.lower() == 'system': # get encoding from system charset = locale.getpreferredencoding() self.repo.importshp(source, False, self.layer.name(), "geogigid", True, charset) message = self.messageBox.toPlainText() self.repo.add() try: self.repo.commit(message) except UnconfiguredUserException, e: configureUser() self.repo.commit(message) except GeoGigException, e: if "Nothing to commit" in e.args[0]: config.iface.messageBar().pushMessage( "No version has been created. Repository is already up to date", level=QgsMessageBar.INFO, duration=4) self.close() return
class ImportDialog(QtGui.QDialog): def __init__(self, parent, repo = None, layer = None): super(ImportDialog, self).__init__(parent) self.repo = repo self.layer = layer self.ok = False self.initGui() def initGui(self): self.setWindowTitle('Add layer to GeoGig repository') verticalLayout = QtGui.QVBoxLayout() if self.repo is None: repos = localRepos() self.repos = {r.title:r.path for r in repos} layerLabel = QtGui.QLabel('Repository') verticalLayout.addWidget(layerLabel) self.repoCombo = QtGui.QComboBox() self.repoCombo.addItems(self.repos.keys()) verticalLayout.addWidget(self.repoCombo) if self.layer is None: layerLabel = QtGui.QLabel('Layer') verticalLayout.addWidget(layerLabel) self.layerCombo = QtGui.QComboBox() layerNames = [layer.name() for layer in getVectorLayers() if layer.source().lower().endswith("shp") and not isTracked(layer)] self.layerCombo.addItems(layerNames) verticalLayout.addWidget(self.layerCombo) messageLabel = QtGui.QLabel('Message to describe this update') verticalLayout.addWidget(messageLabel) self.messageBox = QtGui.QPlainTextEdit() self.messageBox.textChanged.connect(self.messageHasChanged) verticalLayout.addWidget(self.messageBox) self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Cancel) self.importButton = QtGui.QPushButton("Add layer") self.importButton.clicked.connect(self.importClicked) self.importButton.setEnabled(False) self.buttonBox.addButton(self.importButton, QtGui.QDialogButtonBox.ApplyRole) self.buttonBox.rejected.connect(self.cancelPressed) verticalLayout.addWidget(self.buttonBox) self.setLayout(verticalLayout) self.resize(400, 200) def messageHasChanged(self): self.importButton.setEnabled(self.messageBox.toPlainText() != "") def importClicked(self): if self.repo is None: connector = PyQtConnectorDecorator() connector.checkIsAlive() self.repo = Repository(self.repos[self.repoCombo.currentText()], connector) if self.layer is None: text = self.layerCombo.currentText() self.layer = resolveLayer(text) source = self.layer.source() hasIdField = self.layer.dataProvider().fieldNameIndex("geogigid") != -1 if not hasIdField: autoAddId = config.getConfigValue(config.GENERAL, config.AUTO_ADD_ID) if not autoAddId: dlg = AddGeogigIdDialog(self) ok, check = dlg.exec_() if ok == QtGui.QMessageBox.No: self.close() return if check: config.setConfigValue(config.GENERAL, config.AUTO_ADD_ID, True) QtGui.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) addIdField(self.layer) QtGui.QApplication.restoreOverrideCursor() hasIdField = self.layer.dataProvider().fieldNameIndex("geogigid") != -1 if not hasIdField: QtGui.QMessageBox.warning(self, "Error", "Could not add 'geogigid' field to layer.\n" "Possible causes for this are:\n" "- No permission to edit the layer.\n", QtGui.QMessageBox.Ok, QtGui.QMessageBox.Ok) return # determine encoding # first look in .cpg file cpgPath = source.replace('.shp', '.cpg') if os.path.exists(cpgPath): with open(cpgPath) as f: charset = f.readline().strip('\r\n') else: # try to get encoding from provider charset = self.layer.dataProvider().encoding() if charset.lower() == 'system': # get encoding from system charset = locale.getpreferredencoding() self.repo.importshp(source, False, self.layer.name(), "geogigid", True, charset) message = self.messageBox.toPlainText() self.repo.add() try: self.repo.commit(message) except UnconfiguredUserException, e: configureUser() self.repo.commit(message) except GeoGigException, e: if "Nothing to commit" in e.args[0]: config.iface.messageBar().pushMessage("No version has been created. Repository is already up to date", level = QgsMessageBar.INFO, duration = 4) self.close() return