--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py Sun Jan 17 13:53:08 2021 +0100 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py Mon Feb 01 10:38:16 2021 +0100 @@ -594,7 +594,7 @@ return col, color, edges def __generateIcon(self, column, color, bottomedges, topedges, dotColor, - currentRev, closed, isDraft): + currentRev, closed, isPushableDraft): """ Private method to generate an icon containing the revision tree for the given data. @@ -615,7 +615,8 @@ @param closed flag indicating to draw an icon for a closed branch @type bool - @param isDraft flag indicating an entry of phase 'draft' + @param isPushableDraft flag indicating an entry of phase 'draft', + that can by pushed @type bool @return icon for the node @rtype QIcon @@ -692,8 +693,9 @@ QPoint(dot_x + 2 * offset, dot_y + 2 * offset) ) else: - if isDraft: - # 'draft' phase: draw an up arrow like outgoing + if isPushableDraft: + # 'draft' phase: draw an up arrow like outgoing, + # if it can be pushed offset = radius // 2 painter.drawConvexPolygon( QPoint(dot_x + offset, dot_y), @@ -859,24 +861,37 @@ def __generateLogItem(self, author, date, message, revision, changedPaths, parents, branches, tags, phase, bookmarks, - latestTag): + latestTag, canPush=False): """ Private method to generate a log tree entry. - @param author author info (string) - @param date date info (string) - @param message text of the log message (list of strings) - @param revision revision info (string) + @param author author info + @type str + @param date date info + @type str + @param message text of the log message + @type list of str + @param revision revision info + @type str @param changedPaths list of dictionary objects containing info about the changed files/directories - @param parents list of parent revisions (list of integers) - @param branches list of branches (list of strings) - @param tags list of tags (string) - @param phase phase of the entry (string) - @param bookmarks list of bookmarks (string) + @type dict + @param parents list of parent revisions + @type list of int + @param branches list of branches + @type list of str + @param tags list of tags + @type str + @param phase phase of the entry + @type str + @param bookmarks list of bookmarks + @type str @param latestTag the latest tag(s) reachable from the changeset - (list of strings) - @return reference to the generated item (QTreeWidgetItem) + @type list of str + @param canPush flag indicating that changesets can be pushed + @type bool + @return reference to the generated item + @rtype QTreeWidgetItem """ logMessageColumnWidth = self.vcs.getPlugin().getPreferences( "LogMessageColumnWidth") @@ -945,7 +960,7 @@ QColor(self.__branchColor(branches[0])), rev in self.__projectWorkingDirParents, rev in self.__closedBranchesRevs, - phase == "draft") + phase == "draft" and canPush) itm.setIcon(0, icon) try: @@ -960,7 +975,7 @@ Private method to retrieve log entries from the repository. @param startRev revision number to start from (integer, string) - @keyparam noEntries number of entries to get (0 = default) (int) + @param noEntries number of entries to get (0 = default) (int) """ self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True) @@ -991,7 +1006,6 @@ args.append('{0}:0'.format(startRev)) if ( not self.projectMode and - not self.fname == "." and not self.stopCheckBox.isChecked() ): args.append('--follow') @@ -1050,15 +1064,18 @@ self.commandMode = "log" self.__finish() - def start(self, fn, bundle=None, isFile=False, noEntries=0): + def start(self, name=None, bundle=None, isFile=False, noEntries=0): """ Public slot to start the hg log command. - @param fn filename to show the log for (string) - @keyparam bundle name of a bundle file (string) - @keyparam isFile flag indicating log for a file is to be shown - (boolean) - @keyparam noEntries number of entries to get (0 = default) (int) + @param name file/directory name to show the log for + @type str + @param bundle name of a bundle file + @type str + @param isFile flag indicating log for a file is to be shown + @type bool + @param noEntries number of entries to get (0 = default) + @type int """ self.__bundle = bundle self.__isFile = isFile @@ -1079,18 +1096,10 @@ self.__initData() - self.__filename = fn - self.dname, self.fname = self.vcs.splitPath(fn) + self.__filename = name - # find the root of the repo - self.repodir = self.dname - while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)): - self.repodir = os.path.dirname(self.repodir) - if os.path.splitdrive(self.repodir)[1] == os.sep: - return - - self.projectMode = (self.fname == "." and self.dname == self.repodir) - self.stopCheckBox.setDisabled(self.projectMode or self.fname == ".") + self.projectMode = name is None + self.stopCheckBox.setDisabled(self.projectMode) self.activateWindow() self.raise_() @@ -1137,6 +1146,7 @@ changedPaths = [] initialText = True fileCopies = {} + canPush = self.vcs.canPush() for s in self.buf: if s != "@@@\n": try: @@ -1226,7 +1236,8 @@ log["author"], log["date"], log["message"], log["revision"], changedPaths, log["parents"], log["branches"], log["tags"], - log["phase"], log["bookmarks"], log["latesttag"]) + log["phase"], log["bookmarks"], log["latesttag"], + canPush=canPush) dt = QDate.fromString(log["date"], Qt.ISODate) if ( not self.__maxDate.isValid() and @@ -1961,7 +1972,7 @@ else: newPhase = self.phases["draft"] data = (revs, "d", False) - res = self.vcs.hgPhase(self.repodir, data) + res = self.vcs.hgPhase(data) if res: for itm in self.logTree.selectedItems(): itm.setText(self.PhaseColumn, newPhase) @@ -1981,7 +1992,7 @@ itm.text(self.RevisionColumn).strip().split(":", 1)[0]) if revs: - shouldReopen = self.vcs.hgGraft(self.repodir, revs) + shouldReopen = self.vcs.hgGraft(revs) if shouldReopen: res = E5MessageBox.yesNo( None, @@ -2005,7 +2016,7 @@ itm = self.logTree.selectedItems()[0] rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] tag = itm.text(self.TagsColumn).strip().split(", ", 1)[0] - res = self.vcs.vcsTag(self.repodir, revision=rev, tagName=tag) + res = self.vcs.vcsTag(revision=rev, tagName=tag) if res: self.on_refreshButton_clicked() @@ -2022,8 +2033,7 @@ if revs: closeheadExtension = self.vcs.getExtensionObject("closehead") if closeheadExtension is not None: - closeheadExtension.hgCloseheads( - self.repodir, revisions=revs) + closeheadExtension.hgCloseheads(revisions=revs) self.on_refreshButton_clicked() @@ -2053,7 +2063,7 @@ if bookmark: rev = bookmark if rev: - shouldReopen = self.vcs.vcsUpdate(self.repodir, revision=rev) + shouldReopen = self.vcs.vcsUpdate(revision=rev) if shouldReopen: res = E5MessageBox.yesNo( None, @@ -2086,7 +2096,7 @@ QLineEdit.Normal) if ok and bool(bookmark): self.vcs.hgBookmarkDefine( - self.repodir, revision="rev({0})".format(rev), + revision="rev({0})".format(rev), bookmark=bookmark) self.on_refreshButton_clicked() @@ -2101,7 +2111,7 @@ rev, changeset = ( itm.text(self.RevisionColumn).strip().split(":", 1) ) - bookmarksList = self.vcs.hgGetBookmarksList(self.repodir) + bookmarksList = self.vcs.hgGetBookmarksList() bookmark, ok = QInputDialog.getItem( self, self.tr("Move Bookmark"), @@ -2111,7 +2121,7 @@ 0, False) if ok and bool(bookmark): self.vcs.hgBookmarkMove( - self.repodir, revision="rev({0})".format(rev), + revision="rev({0})".format(rev), bookmark=bookmark) self.on_refreshButton_clicked() @@ -2128,8 +2138,7 @@ revs.append(rev) if revs: - self.vcs.getExtensionObject("largefiles").hgLfPull( - self.repodir, revisions=revs) + self.vcs.getExtensionObject("largefiles").hgLfPull(revisions=revs) @pyqtSlot() def __pullActTriggered(self): @@ -2147,7 +2156,7 @@ rev = itm.text(self.RevisionColumn).split(":")[1].strip() if rev: revs.append(rev) - shouldReopen = self.vcs.hgPull(self.repodir, revisions=revs) + shouldReopen = self.vcs.hgPull(revisions=revs) refresh = True if self.initialCommandMode == "incoming": addNext = True @@ -2176,7 +2185,7 @@ if not itm.data(0, self.__incomingRole): rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] if rev: - self.vcs.hgPush(self.repodir, rev=rev) + self.vcs.hgPush(rev=rev) self.on_refreshButton_clicked( addNext=self.initialCommandMode == "outgoing") @@ -2185,7 +2194,7 @@ """ Private slot to push all changes to a remote repository. """ - self.vcs.hgPush(self.repodir) + self.vcs.hgPush() self.on_refreshButton_clicked() @pyqtSlot() @@ -2197,7 +2206,7 @@ if not itm.data(0, self.__incomingRole): rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1] shouldReopen = self.vcs.getExtensionObject("strip").hgStrip( - self.repodir, rev=rev) + rev=rev) if shouldReopen: res = E5MessageBox.yesNo( None, @@ -2221,7 +2230,7 @@ if not itm.data(0, self.__incomingRole): rev = "rev({0})".format( itm.text(self.RevisionColumn).strip().split(":", 1)[0]) - self.vcs.vcsMerge(self.repodir, rev=rev) + self.vcs.vcsMerge("", rev=rev) @pyqtSlot() def __bundleActTriggered(self): @@ -2280,7 +2289,7 @@ "all": False, } - self.vcs.hgBundle(self.repodir, bundleData=bundleData) + self.vcs.hgBundle(bundleData=bundleData) @pyqtSlot() def __unbundleActTriggered(self): @@ -2288,8 +2297,7 @@ Private slot to apply the currently previewed bundle file. """ if self.initialCommandMode == "incoming" and bool(self.__bundle): - shouldReopen = self.vcs.hgUnbundle(self.repodir, - files=[self.__bundle]) + shouldReopen = self.vcs.hgUnbundle(files=[self.__bundle]) if shouldReopen: res = E5MessageBox.yesNo( None, @@ -2300,7 +2308,7 @@ e5App().getObject("Project").reopenProject() return - self.vcs.vcsLogBrowser(self.repodir) + self.vcs.vcsLogBrowser() self.close() @pyqtSlot() @@ -2316,8 +2324,7 @@ revs.append(rev) if revs: - self.vcs.getExtensionObject("gpg").hgGpgSign( - self.repodir, revisions=revs) + self.vcs.getExtensionObject("gpg").hgGpgSign(revisions=revs) @pyqtSlot() def __gpgVerifyActTriggered(self): @@ -2329,7 +2336,7 @@ rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip() if rev: self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures( - self.repodir, rev=rev) + rev=rev) def __selectAllActTriggered(self, select=True): """ @@ -2685,7 +2692,7 @@ @param link text of the selected link @type str """ - if ":" in link: + if ":" in link and self.__filename is not None: scheme, path = link.split(":", 1) if scheme == "sbsdiff" and "_" in path: rev1, rev2 = path.split("_", 1)