示例#1
0
    def __init__(self, tree, parent, repo, layer, branch, branchCommitId):
        QTreeWidgetItem.__init__(self, parent)
        self.repo = repo
        self.tree = tree
        self.layer = layer
        self.branch = branch
        self.currentCommitId = None
        self.branchCommitId = branchCommitId
        self.setIcon(0, layerIcon)
        self.setText(0, self.layer)

        self.status = self.NOT_EXPORTED
        trackedlayer = getTrackingInfoForGeogigLayer(self.repo.url, layer)
        if trackedlayer:
            if os.path.exists(trackedlayer.geopkg):
                try:
                    con = sqlite3.connect(trackedlayer.geopkg)
                    cursor = con.cursor()
                    cursor.execute("SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';" % layer)
                    self.currentCommitId = cursor.fetchone()[0]
                    cursor.close()
                    con.close()
                    if branchCommitId == self.currentCommitId:
                        self.status = self.IN_SYNC
                    else:
                        self.status = self.NOT_IN_SYNC
                except:
                    pass
示例#2
0
    def _removeLayer(self):
        user, email = config.getUserInfo()
        if user is None:
            return

        self.repo.removetree(self.layer, user, email, self.branch)

        config.iface.messageBar().pushMessage("Layer correctly removed from repository",
                                               level = QgsMessageBar.INFO, duration = 5)

        layer = getProjectLayerForGeoGigLayer(self.repo.url, self.layer)
        if layer:
            branches = self.repo.branches()
            layerInRepo = False
            for branch in branches:
                layers = self.repo.trees(branch)
                if self.layer in layers:
                    layerInRepo = True
                    break
            if not layerInRepo:
                setAsNonRepoLayer(layer)
                tracking = getTrackingInfoForGeogigLayer(self.repo.url, self.layer)
                if tracking:
                    removeTrackedLayer(tracking.source)
        #TODO remove triggers from layer
        repoWatcher.repoChanged.emit(self.repo)
def exportFullRepo(repo, ref = geogig.HEAD):
    trees = repo.trees
    ref = repo.revparse(ref)
    for tree in trees:
        trackedlayer = getTrackingInfoForGeogigLayer(repo.url, tree.path)
        if trackedlayer is None or not os.path.exists(trackedlayer.source):
            filepath = os.path.join(repo.url, tree.path + ".shp")
            repo.exportshp(ref, tree.path, filepath, "utf-8")
            addTrackedLayer(filepath, repo.url, tree.path, ref)
        elif trackedlayer.ref != ref:
            repo.exportshp(ref, tree.path, trackedlayer.source, "utf-8")
            setRef(trackedlayer.source, ref)
示例#4
0
def exportFullRepo(repo, ref=geogig.HEAD):
    trees = repo.trees
    ref = repo.revparse(ref)
    for tree in trees:
        trackedlayer = getTrackingInfoForGeogigLayer(repo.url, tree.path)
        if trackedlayer is None or not os.path.exists(trackedlayer.source):
            filepath = os.path.join(repo.url, tree.path + ".shp")
            repo.exportshp(ref, tree.path, filepath, "utf-8")
            addTrackedLayer(filepath, repo.url, tree.path, ref)
        elif trackedlayer.ref != ref:
            repo.exportshp(ref, tree.path, trackedlayer.source, "utf-8")
            setRef(trackedlayer.source, ref)
示例#5
0
    def exportVersion(self, repo, layer, commitId):
        trackedlayer = getTrackingInfoForGeogigLayer(repo.url, layer)
        if trackedlayer:
            if os.path.exists(trackedlayer.geopkg):
                try:
                    con = sqlite3.connect(trackedlayer.geopkg)
                    cursor = con.cursor()
                    cursor.execute(
                        "SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';"
                        % layer)
                    currentCommitId = cursor.fetchone()[0]
                    cursor.close()
                    con.close()
                    if commitId != currentCommitId:
                        msgBox = QMessageBox()
                        msgBox.setWindowTitle("Layer was already exported")
                        msgBox.setText(
                            "This layer was exported already at a different commit.\n"
                            "Which one would you like to add to your QGIS project?"
                        )
                        msgBox.addButton(
                            QPushButton('Use previously exported commit'),
                            QMessageBox.YesRole)
                        msgBox.addButton(
                            QPushButton('Use latest commit from this branch'),
                            QMessageBox.NoRole)
                        msgBox.addButton(QPushButton('Cancel'),
                                         QMessageBox.RejectRole)
                        QApplication.restoreOverrideCursor()
                        ret = msgBox.exec_()
                        if ret == 0:
                            checkoutLayer(repo, layer, None, currentCommitId)
                        elif ret == 1:
                            try:
                                layer = checkoutLayer(repo, layer, None,
                                                      commitId)
                                repoWatcher.layerUpdated.emit(layer)
                            except HasLocalChangesError:
                                QMessageBox.warning(
                                    config.iface.mainWindow(),
                                    'Cannot export this commit',
                                    "The layer has local changes that would be overwritten.\n"
                                    "Either sync layer with branch or revert local changes "
                                    "before changing commit", QMessageBox.Ok)
                except:
                    checkoutLayer(repo, layer, None, currentCommitId)

        else:
            checkoutLayer(repo, layer, None, commitId)
示例#6
0
        def _prepareDescription():
            try:
                c = self.log(limit=1)[0]
                epoch = time.mktime(c.committerdate.timetuple())
                offset = datetime.fromtimestamp(
                    epoch) - datetime.utcfromtimestamp(epoch)
                d = c.committerdate + offset
                lastDate = d.strftime("%b %d, %Y %I:%M%p")
                author = c.authorname
                lastVersion = "%s (%s by %s)" % (c.message.splitlines()[0],
                                                 lastDate, author)
            except:
                lastVersion = ""
            with open(resourceFile("descriptiontemplate_edit.html")) as f:
                s = "".join(f.readlines())
            s = s.replace("[TITLE]", self.title)
            s = s.replace("[URL]", self.url)
            s = s.replace("[LAST_VERSION]", lastVersion)

            layers = []
            for tree in self.trees():
                trackedlayer = getTrackingInfoForGeogigLayer(self.url, tree)
                if trackedlayer:
                    filepath = trackedlayer.geopkg
                    try:
                        con = sqlite3.connect(trackedlayer.geopkg)
                        cursor = con.cursor()
                        cursor.execute(
                            "SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';"
                            % tree)
                        commitid = cursor.fetchone()[0]
                        cursor.close()
                        con.close()
                        current = commitid
                    except:
                        current = "Not available"
                else:
                    filepath = "Not exported"
                    current = "Not available"
                layer = (
                    "<li><b>%s <a href='checkout:%s'>[Add to QGIS]</a></b>"
                    "<p><i>Filepath</i>: <b>%s</b></p><p><i>Current version</i>: <b>%s</b></p></li>"
                ) % (tree, tree, filepath, current)
                layers.append(layer)

            layers = "<ul>%s</ul>" % "".join(layers)
            s = s.replace("[LAYERS]", layers)
            s = s.replace("[LAYERNAMES]", ",".join(self.trees()))
            return s
def exportFullRepo(repo, ref = geogig.HEAD):
    reponame = nameFromRepoPath(repo.url)
    repouser = userFromRepoPath(repo.url)
    repoowner = ownerFromRepoPath(repo.url)
    trees = repo.trees
    ref = repo.revparse(ref)
    for tree in trees:
        trackedlayer = getTrackingInfoForGeogigLayer(repo.url, tree.path)
        if trackedlayer is None or not os.path.exists(trackedlayer.source):
            filepath = os.path.join(repo.url, tree.path + ".shp")
            repo.exportshp(ref, tree.path, filepath)
            addTrackedLayer(filepath, reponame, repoowner, repouser, tree.path, ref)
        elif trackedlayer.ref != ref:
            repo.exportshp(ref, tree.path, trackedlayer.source)
            setRef(trackedlayer.source, ref)
    def exportVersion(self, repo, layer, commitId):
        trackedlayer = getTrackingInfoForGeogigLayer(repo.url, layer)
        if trackedlayer:
            if os.path.exists(trackedlayer.geopkg):
                try:
                    con = sqlite3.connect(trackedlayer.geopkg)
                    cursor = con.cursor()
                    cursor.execute("SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';" % layer)
                    currentCommitId = cursor.fetchone()[0]
                    cursor.close()
                    con.close()
                    if commitId != currentCommitId:
                        msgBox = QMessageBox()
                        msgBox.setWindowTitle("Layer was already exported")
                        msgBox.setText("This layer was exported already at a different commit.\n"
                                       "Which one would you like to add to your QGIS project?")
                        msgBox.addButton(QPushButton('Use previously exported commit'), QMessageBox.YesRole)
                        msgBox.addButton(QPushButton('Use latest commit from this branch'), QMessageBox.NoRole)
                        msgBox.addButton(QPushButton('Cancel'), QMessageBox.RejectRole)
                        QApplication.restoreOverrideCursor()
                        ret = msgBox.exec_()
                        if ret == 0:
                            checkoutLayer(repo, layer, None, currentCommitId)
                        elif ret == 1:
                            try:
                                layer = checkoutLayer(repo, layer, None, commitId)
                                repoWatcher.layerUpdated.emit(layer)
                            except HasLocalChangesError:
                                QMessageBox.warning(config.iface.mainWindow(), 'Cannot export this commit',
                                                    "The layer has local changes that would be overwritten.\n"
                                                    "Either sync layer with branch or revert local changes "
                                                    "before changing commit",QMessageBox.Ok)
                except:
                    checkoutLayer(repo, layer, None, currentCommitId)

        else:
            checkoutLayer(repo, layer, None, commitId)
示例#9
0
def checkoutLayer(repo, layername, bbox, ref=None):
    ref = ref or repo.HEAD
    newCommitId = repo.revparse(ref)
    trackedlayer = getTrackingInfoForGeogigLayer(repo.url, layername)
    if trackedlayer is not None:
        if not os.path.exists(trackedlayer.geopkg):
            removeTrackedLayer(trackedlayer.source)
            trackedlayer = None
            filename = layerGeopackageFilename(layername, repo.title,
                                               repo.group)
            source = "%s|layername=%s" % (filename, layername)
        else:
            source = trackedlayer.source
    else:
        filename = layerGeopackageFilename(layername, repo.title, repo.group)
        source = "%s|layername=%s" % (filename, layername)

    if trackedlayer is None:
        repo.checkoutlayer(filename, layername, bbox, ref or repo.HEAD)
        addTrackedLayer(source, repo.url)
        try:
            layer = resolveLayerFromSource(source)
            iface.messageBar().pushMessage(
                "GeoGig",
                "Layer was already included in the current QGIS project",
                level=QgsMessageBar.INFO,
                duration=5)
        except WrongLayerSourceException:
            layer = loadLayerNoCrsDialog(source, layername, "ogr")
            QgsMapLayerRegistry.instance().addMapLayers([layer])
            iface.messageBar().pushMessage("GeoGig",
                                           "Layer correctly added to project",
                                           level=QgsMessageBar.INFO,
                                           duration=5)
    elif ref is not None:
        currentCommitId = getCommitId(source)
        try:
            layer = resolveLayerFromSource(source)
            wasLoaded = True
        except WrongLayerSourceException:
            layer = loadLayerNoCrsDialog(source, layername, "ogr")
            wasLoaded = False

        if newCommitId != currentCommitId:
            if hasLocalChanges(layer):
                raise HasLocalChangesError()
            filename, layername = namesFromLayer(layer)
            repo.checkoutlayer(filename, layername, bbox, ref)
            layer.reload()
            if not wasLoaded:
                QgsMapLayerRegistry.instance().addMapLayers([layer])
                iface.messageBar().pushMessage(
                    "GeoGig",
                    "Layer correctly added to project",
                    level=QgsMessageBar.INFO,
                    duration=5)
            else:
                iface.messageBar().pushMessage(
                    "GeoGig",
                    "Layer correctly updated to specified version",
                    level=QgsMessageBar.INFO,
                    duration=5)
                layer.triggerRepaint()
        else:
            if wasLoaded:
                iface.messageBar().pushMessage(
                    "GeoGig",
                    "Layer was already included in the current QGIS project",
                    level=QgsMessageBar.INFO,
                    duration=5)
            else:
                QgsMapLayerRegistry.instance().addMapLayers([layer])
                iface.messageBar().pushMessage(
                    "GeoGig",
                    "Layer correctly added to the current QGIS project",
                    level=QgsMessageBar.INFO,
                    duration=5)

    repoWatcher.repoChanged.emit(repo)
    return layer
示例#10
0
    def __init__(self, tree, parent, repo, layer, branch, branchCommitId):
        QTreeWidgetItem.__init__(self, parent)
        self.repo = repo
        self.tree = tree
        self.layer = layer
        self.branch = branch
        self.currentCommitId = None
        self.setIcon(0, layerIcon)

        layout = QHBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        self.label = QLabel()
        self.label.setText(layer)
        self.labelLinks = QLabel()
        self.labelLinks.setText("<a href='#'>Add to QGIS</a>")
        self.label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        layout.addWidget(self.label)
        layout.addWidget(self.labelLinks)
        layout.addStretch()

        def add():
            if self.status == self.NOT_IN_SYNC:
                msgBox = QMessageBox()
                msgBox.setText(
                    "This layer was exported already at a different version.\nWhich version would you like to add to your QGIS project?"
                )
                msgBox.addButton(QPushButton('Use exported version'),
                                 QMessageBox.YesRole)
                msgBox.addButton(QPushButton('Use version from this branch'),
                                 QMessageBox.NoRole)
                msgBox.addButton(QPushButton('Cancel'), QMessageBox.RejectRole)
                QApplication.restoreOverrideCursor()
                ret = msgBox.exec_()
                if ret == 0:
                    checkoutLayer(self.repo, self.layer, None,
                                  self.currentCommitId)
                elif ret == 1:
                    try:
                        layer = checkoutLayer(self.repo, self.layer, None,
                                              branchCommitId)
                        repoWatcher.layerUpdated.emit(layer)
                    except HasLocalChangesError:
                        QMessageBox.warning(
                            config.iface.mainWindow(), 'Cannot change version',
                            "There are local changes that would be overwritten.\n"
                            "Revert them before changing version.",
                            QMessageBox.Ok)
            else:
                checkoutLayer(self.repo, self.layer, None, branchCommitId)

        self.labelLinks.linkActivated.connect(add)
        w = QWidget()
        w.setLayout(layout)
        self.tree.setItemWidget(self, 0, w)

        self.status = self.NOT_EXPORTED
        trackedlayer = getTrackingInfoForGeogigLayer(self.repo.url, layer)
        if trackedlayer:
            try:
                con = sqlite3.connect(trackedlayer.geopkg)
                cursor = con.cursor()
                cursor.execute(
                    "SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';"
                    % layer)
                self.currentCommitId = cursor.fetchone()[0]
                cursor.close()
                con.close()
                if branchCommitId == self.currentCommitId:
                    self.status = self.IN_SYNC
                else:
                    self.status = self.NOT_IN_SYNC
                    self.label.setText("<font color='orange'>%s</font>" %
                                       layer)
            except:
                pass