def doUpdateLayer(self, dest, repo):
     if self.layer.dataProvider().fieldNameIndex("geogigid") == -1:
         iface.messageBar().pushMessage("Cannot update GeoGig repository. Layer has no 'geogigid' field",
                                                   level = QgsMessageBar.WARNING, duration = 4)
     else:
         exported = exportVectorLayer(self.layer)
         repo.importshp(exported, False, dest, "geogigid", True)
         setInSync(self.layer, True)
    def editingStopped(self):
        if not isTracked(self.layer):
            _logger.debug("Editing stopped for layer '%s'. Layer is not tracked" % self.layer.name())
            return
        if not self.hasChanges:
            _logger.debug("Editing stopped for layer '%s' without changes" % self.layer.name())
            return
        if self.rollback:
            self.rollback = False
            return
        _logger.debug("Editing stopped for layer '%s'." % self.layer.name())

        trackedlayer = getTrackingInfo(self.layer)
        insync = trackedlayer.insync
        setInSync(self.layer, False)

        self.ensureUniqueIDs()
        self.hasChanges = False

        try:
            repo = createRepository(trackedlayer.repoFolder(), False)
        except Py4JConnectionException:
            _logger.debug("Could not connect to repository for updating layer '%s'" % self.layer.name())
            QtGui.QApplication.restoreOverrideCursor()
            dlg = GatewayNotAvailableWhileEditingDialog(iface.mainWindow())
            dlg.exec_()
            setInSync(self.layer, False)
            return
        QtGui.QApplication.restoreOverrideCursor()
        if insync and self.canUseSmartUpdate:
            try:
                _logger.debug("Trying smart update on layer %s and repo %s"
                              % (self.layer.source(), trackedlayer.reponame))
                self.doSmartUpdate(trackedlayer.layername, repo)
            except Exception, e:
                _logger.error(traceback.format_exc())
                _logger.debug("Smart update failed. Using import update instead")
                self.doUpdateLayer(trackedlayer.layername, repo)
            repo.addandcommit(dlg.getMessage())
        except UnconfiguredUserException, e:
            #It should not raise this exception unless config file has been manually deleted
            configdlg = UserConfigDialog(iface.mainWindow())
            configdlg.exec_()
            if configdlg.user is not None:
                repo.config(geogig.USER_NAME, configdlg.user)
                repo.config(geogig.USER_EMAIL, configdlg.email)
                repo.commit(dlg.getMessage())
            else:
                return
        headid = repo.revparse(geogig.HEAD)
        setRef(self.layer, headid)
        iface.messageBar().pushMessage("Repository correctly updated",
                                                  level = QgsMessageBar.INFO, duration = 4)
        setInSync(self.layer, True)


    def _getFid(self, feature):
        try:
            return  feature['geogigid']
        except:
            raise Exception("No ID field found in layer")


    def doSmartUpdate(self, dest, repo):
        features = {}
        geomField = "geom"
        try:
            ftype = repo.featuretype(geogig.HEAD, dest)
            for fieldName, fieldType in ftype.iteritems():