Exemplo n.º 1
0
 def testOsmImport(self):
     repoPath =  self.getTempRepoPath()         
     repo = Repository(repoPath, init = True)
     osmfile = os.path.join(os.path.dirname(__file__), "data", "osm", "ways.xml")        
     repo.importosm(osmfile)
     feature = Feature(repo, geogig.WORK_HEAD, "way/31045880")
     self.assertTrue(feature.exists())
Exemplo n.º 2
0
 def testOsmImport(self):
     repoPath =  self.getTempRepoPath()         
     repo = Repository(repoPath, init = True)
     osmfile = os.path.join(os.path.dirname(__file__), "data", "osm", "ways.xml")        
     repo.importosm(osmfile)
     feature = Feature(repo, geogig.WORK_HEAD, "way/31045880")
     self.assertTrue(feature.exists())
Exemplo n.º 3
0
 def createRepo(self):
     repopath =  self.getTempFolderPath()         
     repo = Repository(repopath, init = True)
     shpfile = os.path.join(os.path.dirname(__file__), "data", "shp", "landuse", "landuse2.shp")
     repo.importshp(shpfile, False, "landuse", "fid")
     repo.addandcommit("first")        
     return repo
Exemplo n.º 4
0
 def testOsmImportWithMappingFile(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, False, mappingfile)     
     feature = Feature(repo, geogig.WORK_HEAD, "onewaystreets/31045880")
     self.assertTrue(feature.exists())
Exemplo n.º 5
0
 def testOsmImportWithMappingFile(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, False, mappingfile)     
     feature = Feature(repo, geogig.WORK_HEAD, "onewaystreets/31045880")
     self.assertTrue(feature.exists())
Exemplo n.º 6
0
 def testLargeDiff(self):
     repo = Repository(self.getTempRepoPath(), init=True)
     path = os.path.join(os.path.dirname(__file__), "data", "shp", "1", "parks.shp")
     repo.importshp(path)
     repo.addandcommit("message")
     path = os.path.join(os.path.dirname(__file__), "data", "shp", "elevation", "elevation.shp")
     repo.importshp(path)
     repo.addandcommit("message_2")
     s = repo.diff("HEAD~1", "HEAD")
Exemplo n.º 7
0
def _checkFeatureModifiedInRepo():
    connector = PyQtConnectorDecorator()
    connector.checkIsAlive()
    repo =  Repository(os.path.join(_tempReposPath, "repos", "repo"), connector)
    diffs = repo.diff("master", Commitish(repo, "master").parent.ref)
    assert 1 == len(diffs)
    layer = layerFromName("points")
    feature = layer.getFeatures().next()
    geogigid = str(feature[1])
    assert "points/" + geogigid == diffs[0].path
Exemplo n.º 8
0
    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)
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
 def testImportExportInDifferentFormats(self):
     repopath =  self.getTempFolderPath()         
     repo = Repository(repopath, init = True)
     geojsonfile = os.path.join(os.path.dirname(__file__), "data", "geojson", "landuse.geojson")
     repo.importgeojson(geojsonfile, False, "landuse", "fid")
     repo.addandcommit("commit")
     shpfile = os.path.join(self.getTempFolderPath(), "landuse.shp")
     repo.exportshp(geogig.HEAD, "landuse", shpfile)
     repo.importshp(shpfile, False, "landuse", "fid")
     unstaged = repo.unstaged()
     self.assertEquals(0, unstaged)
Exemplo n.º 11
0
 def testOsmImportWithMapping(self):
     mapping = OSMMapping()
     rule = OSMMappingRule("onewaystreets")
     rule.addfilter("oneway", "yes")
     rule.addfield("lit", "lit", geogig.TYPE_STRING)
     rule.addfield("geom", "the_geom", geogig.TYPE_LINESTRING)
     mapping.addrule(rule)
     repoPath =  self.getTempRepoPath()         
     repo = Repository(repoPath, init = True)
     osmfile = os.path.join(os.path.dirname(__file__), "data", "osm", "ways.xml")        
     repo.importosm(osmfile, False, mapping)     
     feature = Feature(repo, geogig.WORK_HEAD, "onewaystreets/31045880")
     self.assertTrue(feature.exists())
Exemplo n.º 12
0
 def testOsmImportWithMapping(self):
     mapping = OSMMapping()
     rule = OSMMappingRule("onewaystreets")
     rule.addfilter("oneway", "yes")
     rule.addfield("lit", "lit", geogig.TYPE_STRING)
     rule.addfield("geom", "the_geom", geogig.TYPE_LINESTRING)
     mapping.addrule(rule)
     repoPath =  self.getTempRepoPath()         
     repo = Repository(repoPath, init = True)
     osmfile = os.path.join(os.path.dirname(__file__), "data", "osm", "ways.xml")        
     repo.importosm(osmfile, False, mapping)     
     feature = Feature(repo, geogig.WORK_HEAD, "onewaystreets/31045880")
     self.assertTrue(feature.exists())
Exemplo n.º 13
0
 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()
Exemplo n.º 14
0
 def testPushToExistingEmptyRepo(self):
     repopath = self.getTempFolderPath()
     remote = Repository(repopath, init=True)
     local = self.createRepo()
     local.addremote("myremote", repopath)
     local.push("myremote")
     self.assertEquals(remote.head.id, local.head.id)
Exemplo n.º 15
0
def createRepo(title):
    safeName = "".join(x for x in title if x.isalnum())
    path = os.path.join(repoFolder(safeName))
    repo = Repository(path, PyQtConnectorDecorator(), True)
    filename = os.path.join(path, "title")
    with open(filename, "w") as f:
        f.write(title)
    return repo
Exemplo n.º 16
0
class MapToolGeoGigInfo(QgsMapTool):
    def __init__(self, canvas):
        QgsMapTool.__init__(self, canvas)
        self.setCursor(QtCore.Qt.CrossCursor)

    def canvasPressEvent(self, e):
        layer = config.iface.activeLayer()
        if layer is None or not isinstance(layer, QgsVectorLayer):
            config.iface.messageBar().pushMessage(
                "No layer selected or the current active layer is not a valid vector layer",
                level=QgsMessageBar.WARNING,
                duration=4)
            return
        if not layertracking.isTracked(layer):
            config.iface.messageBar().pushMessage(
                "The current active layer is not being tracked as part of a GeoGig repo",
                level=QgsMessageBar.WARNING,
                duration=4)
            return

        trackedlayer = layertracking.getTrackingInfo(layer)
        point = self.toMapCoordinates(e.pos())
        searchRadius = self.canvas().extent().width() * .01
        r = QgsRectangle()
        r.setXMinimum(point.x() - searchRadius)
        r.setXMaximum(point.x() + searchRadius)
        r.setYMinimum(point.y() - searchRadius)
        r.setYMaximum(point.y() + searchRadius)

        r = self.toLayerCoordinates(layer, r)

        fit = layer.getFeatures(QgsFeatureRequest().setFilterRect(r).setFlags(
            QgsFeatureRequest.ExactIntersect))
        fid = None
        try:
            feature = fit.next()
            try:
                fid = unicode(feature["geogigid"])
            except:
                pass
        except StopIteration, e:
            return
        if fid is None:
            config.iface.messageBar().pushMessage(
                "No 'geogigid' field found in layer. Cannot identify features.",
                level=QgsMessageBar.WARNING,
                duration=4)
            return
        try:
            connector = PyQtConnectorDecorator()
            connector.checkIsAlive()
            repo = Repository(trackedlayer.repoFolder, connector, False)
        except Exception, e:
            config.iface.messageBar().pushMessage(
                "The repository linked to the active layer is not valid",
                level=QgsMessageBar.WARNING,
                duration=4)
            return
Exemplo n.º 17
0
    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)
Exemplo n.º 18
0
def connect2repo(path, remote='localhost', repo_type='local'):

    print 'connect 2 repo %s' % path
    if os.path.isdir(os.path.join(path, '.geogig')):
        print "Set to existing repo"
        try:
            repos = Repository(path)
        except GeoGigException, e:
            print e

        return repos
Exemplo n.º 19
0
 def createRepo(self):
     repopath = self.getTempFolderPath()
     repo = Repository(repopath, init=True)
     shpfile = os.path.join(os.path.dirname(__file__), "data", "shp",
                            "landuse", "landuse2.shp")
     repo.importshp(shpfile, False, "landuse", "fid")
     repo.addandcommit("first")
     return repo
    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

        self.repo.importshp(source, False, self.layer.name(), "geogigid", True)
        message = self.messageBox.toPlainText()
        self.repo.add()
        try:
            self.repo.commit(message)
        except UnconfiguredUserException, e:
            configdlg = UserConfigDialog(config.iface.mainWindow())
            configdlg.exec_()
            if configdlg.user is not None:
                self.repo.config(geogig.USER_NAME, configdlg.user)
                self.repo.config(geogig.USER_EMAIL, configdlg.email)
                self.repo.commit(message)
            else:
                return
Exemplo n.º 21
0
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
Exemplo n.º 22
0
 def testLogEmptyRepo(self):
     repoPath =  self.getTempRepoPath()         
     repo = Repository(repoPath, init = True) 
     log = repo.log()
     self.assertFalse(log)
Exemplo n.º 23
0
def createRepo():
    global _repo
    repo = Repository(getTempRepoPath(), init=True)
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "1",
                        "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message")
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "2",
                        "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_2")
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "3",
                        "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_3")
    repo.createbranch(geogig.HEAD, "conflicted")
    repo.createbranch(geogig.HEAD, "unconflicted")
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "4",
                        "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_4")
    repo.checkout("conflicted")
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "5",
                        "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_5")
    repo.checkout("unconflicted")
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "6",
                        "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_6")
    repo.checkout(geogig.MASTER)
    repo.config(geogig.USER_NAME, "user")
    repo.config(geogig.USER_EMAIL, "user")
    _repo = repo
Exemplo n.º 24
0
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
Exemplo n.º 25
0
def getClonedRepo(): 
    repo = Repository(os.path.join(os.path.dirname(__file__), '../test/data/testrepo'))
    dst = getTempPath()
    return repo.clone(dst) 
Exemplo n.º 26
0
 def testCreateEmptyRepo(self):    
     repoPath =  self.getTempRepoPath()         
     Repository(repoPath, init = True)    
Exemplo n.º 27
0
 def testImportExportInDifferentFormats(self):
     repopath = self.getTempFolderPath()
     repo = Repository(repopath, init=True)
     geojsonfile = os.path.join(os.path.dirname(__file__), "data",
                                "geojson", "landuse.geojson")
     repo.importgeojson(geojsonfile, False, "landuse", "fid")
     repo.addandcommit("commit")
     shpfile = os.path.join(self.getTempFolderPath(), "landuse.shp")
     repo.exportshp(geogig.HEAD, "landuse", shpfile)
     repo.importshp(shpfile, False, "landuse", "fid")
     unstaged = repo.unstaged()
     self.assertEquals(0, unstaged)
Exemplo n.º 28
0
 def repo(self):
     if self._repo is None:
         connector = PyQtConnectorDecorator()
         connector.checkIsAlive()
         self._repo = Repository(self.path, connector)
     return self._repo
Exemplo n.º 29
0
 def testLogEmptyRepo(self):
     repoPath =  self.getTempRepoPath()         
     repo = Repository(repoPath, init = True) 
     log = repo.log()
     self.assertFalse(log)
Exemplo n.º 30
0
def connect2repo(path, remote='localhost', repo_type='local'):

    print 'connect 2 repo %s' % path
    if os.path.isdir(os.path.join(path, '.geogig')):
        print "Set to existing repo"
        try:
            repos = Repository(path)
        except GeoGigException, e:
            print e

        return repos
    else:
        if repo_type == "remote":
            try:
                repos = Repository.newrepofromclone(remote, path)
            except GeoGigException, e:
                print e
            print "New repo from clone"
        else:
            try:
                repos = Repository(path, init=True)
            except GeoGigException, e:
                print e
            print "New repo initialized at : %s" % path
    return repos


def export_to_geojson(repos, filepath):
    for t in repos.trees:
        print "t: %s" % t.path
Exemplo n.º 31
0
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
Exemplo n.º 32
0
def _addRemote():
    connector = PyQtConnectorDecorator()
    connector.checkIsAlive()
    repo =  Repository(os.path.join(_tempReposPath, "repos", "local"), connector)
    remotePath = os.path.join(_tempReposPath, "repos", "remote")
    repo.addremote("remote", remotePath , "user", "pass")
Exemplo n.º 33
0
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
Exemplo n.º 34
0
def _repoForLayer(layer):
    tracking = getTrackingInfo(layer)
    connector = PyQtConnectorDecorator()
    connector.checkIsAlive()
    return Repository(tracking.repoFolder, connector), tracking.layername
Exemplo n.º 35
0
def connect2repo(path, remote='localhost', repo_type='local'):

    print 'connect 2 repo %s' % path
    if os.path.isdir(os.path.join(path, '.geogig')):
        print "Set to existing repo"
        try:
            repos = Repository(path)
        except GeoGigException, e:
            print e

        return repos
    else:
        if repo_type == "remote":
            try:
                repos = Repository.newrepofromclone(remote, path)
            except GeoGigException, e:
                print e
            print "New repo from clone"
        else:
            try:
                repos = Repository(path, init=True)
            except GeoGigException, e:
                print e
            print "New repo initialized at : %s" % path
    return repos


def export_to_geojson(repos, filepath):
    for t in repos.trees:
        print "t: %s" % t.path
Exemplo n.º 36
0
 def testLargeDiff(self):
     repo = Repository(self.getTempRepoPath(), init=True)
     path = os.path.join(os.path.dirname(__file__), "data", "shp", "1",
                         "parks.shp")
     repo.importshp(path)
     repo.addandcommit("message")
     path = os.path.join(os.path.dirname(__file__), "data", "shp",
                         "elevation", "elevation.shp")
     repo.importshp(path)
     repo.addandcommit("message_2")
     s = repo.diff("HEAD~1", "HEAD")
Exemplo n.º 37
0
 def getClonedRepo(self):
     src = self.repo.url
     dst = self.getTempPath()
     shutil.copytree(src, dst)
     return Repository(dst)
Exemplo n.º 38
0
    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)
Exemplo n.º 39
0
def createRepo():
    global _repo
    repo = Repository(getTempRepoPath(), init = True)
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "1", "parks.shp")
    repo.importshp(path)   
    repo.addandcommit("message")
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "2", "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_2")        
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "3", "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_3")
    repo.createbranch(geogig.HEAD, "conflicted")
    repo.createbranch(geogig.HEAD, "unconflicted")
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "4", "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_4")
    repo.checkout("conflicted")
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "5", "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_5")
    repo.checkout("unconflicted")
    path = os.path.join(os.path.dirname(__file__), "data", "shp", "6", "parks.shp")
    repo.importshp(path)
    repo.addandcommit("message_6")
    repo.checkout(geogig.MASTER)
    repo.config(geogig.USER_NAME, "user")
    repo.config(geogig.USER_EMAIL, "user")
    _repo = repo