989 if startRev is not None: |
989 if startRev is not None: |
990 args.append('--rev') |
990 args.append('--rev') |
991 args.append('{0}:0'.format(startRev)) |
991 args.append('{0}:0'.format(startRev)) |
992 if ( |
992 if ( |
993 not self.projectMode and |
993 not self.projectMode and |
994 not self.fname == "." and |
|
995 not self.stopCheckBox.isChecked() |
994 not self.stopCheckBox.isChecked() |
996 ): |
995 ): |
997 args.append('--follow') |
996 args.append('--follow') |
998 if self.commandMode == "log": |
997 if self.commandMode == "log": |
999 args.append('--copies') |
998 args.append('--copies') |
1048 ): |
1047 ): |
1049 # no incoming changesets, just switch to log mode |
1048 # no incoming changesets, just switch to log mode |
1050 self.commandMode = "log" |
1049 self.commandMode = "log" |
1051 self.__finish() |
1050 self.__finish() |
1052 |
1051 |
1053 def start(self, fn, bundle=None, isFile=False, noEntries=0): |
1052 def start(self, name=None, bundle=None, isFile=False, noEntries=0): |
1054 """ |
1053 """ |
1055 Public slot to start the hg log command. |
1054 Public slot to start the hg log command. |
1056 |
1055 |
1057 @param fn filename to show the log for (string) |
1056 @param name file/directory name to show the log for |
1058 @param bundle name of a bundle file (string) |
1057 @type str |
|
1058 @param bundle name of a bundle file |
|
1059 @type str |
1059 @param isFile flag indicating log for a file is to be shown |
1060 @param isFile flag indicating log for a file is to be shown |
1060 (boolean) |
1061 @type bool |
1061 @param noEntries number of entries to get (0 = default) (int) |
1062 @param noEntries number of entries to get (0 = default) |
|
1063 @type int |
1062 """ |
1064 """ |
1063 self.__bundle = bundle |
1065 self.__bundle = bundle |
1064 self.__isFile = isFile |
1066 self.__isFile = isFile |
1065 |
1067 |
1066 if self.initialCommandMode == "full_log": |
1068 if self.initialCommandMode == "full_log": |
1077 self.errors.clear() |
1079 self.errors.clear() |
1078 QApplication.processEvents() |
1080 QApplication.processEvents() |
1079 |
1081 |
1080 self.__initData() |
1082 self.__initData() |
1081 |
1083 |
1082 self.__filename = fn |
1084 self.__filename = name |
1083 self.dname, self.fname = self.vcs.splitPath(fn) |
1085 |
1084 |
1086 self.projectMode = name is None |
1085 # find the root of the repo |
1087 self.stopCheckBox.setDisabled(self.projectMode) |
1086 self.repodir = self.dname |
|
1087 while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)): |
|
1088 self.repodir = os.path.dirname(self.repodir) |
|
1089 if os.path.splitdrive(self.repodir)[1] == os.sep: |
|
1090 return |
|
1091 |
|
1092 self.projectMode = (self.fname == "." and self.dname == self.repodir) |
|
1093 self.stopCheckBox.setDisabled(self.projectMode or self.fname == ".") |
|
1094 self.activateWindow() |
1088 self.activateWindow() |
1095 self.raise_() |
1089 self.raise_() |
1096 |
1090 |
1097 self.logTree.clear() |
1091 self.logTree.clear() |
1098 self.__started = True |
1092 self.__started = True |
1959 newPhase = self.phases["secret"] |
1953 newPhase = self.phases["secret"] |
1960 data = (revs, "s", True) |
1954 data = (revs, "s", True) |
1961 else: |
1955 else: |
1962 newPhase = self.phases["draft"] |
1956 newPhase = self.phases["draft"] |
1963 data = (revs, "d", False) |
1957 data = (revs, "d", False) |
1964 res = self.vcs.hgPhase(self.repodir, data) |
1958 res = self.vcs.hgPhase(data) |
1965 if res: |
1959 if res: |
1966 for itm in self.logTree.selectedItems(): |
1960 for itm in self.logTree.selectedItems(): |
1967 itm.setText(self.PhaseColumn, newPhase) |
1961 itm.setText(self.PhaseColumn, newPhase) |
1968 |
1962 |
1969 @pyqtSlot() |
1963 @pyqtSlot() |
1979 if branch != self.__projectBranch: |
1973 if branch != self.__projectBranch: |
1980 revs.append( |
1974 revs.append( |
1981 itm.text(self.RevisionColumn).strip().split(":", 1)[0]) |
1975 itm.text(self.RevisionColumn).strip().split(":", 1)[0]) |
1982 |
1976 |
1983 if revs: |
1977 if revs: |
1984 shouldReopen = self.vcs.hgGraft(self.repodir, revs) |
1978 shouldReopen = self.vcs.hgGraft(revs) |
1985 if shouldReopen: |
1979 if shouldReopen: |
1986 res = E5MessageBox.yesNo( |
1980 res = E5MessageBox.yesNo( |
1987 None, |
1981 None, |
1988 self.tr("Copy Changesets"), |
1982 self.tr("Copy Changesets"), |
1989 self.tr( |
1983 self.tr( |
2003 if len([itm for itm in self.logTree.selectedItems() |
1997 if len([itm for itm in self.logTree.selectedItems() |
2004 if not itm.data(0, self.__incomingRole)]) == 1: |
1998 if not itm.data(0, self.__incomingRole)]) == 1: |
2005 itm = self.logTree.selectedItems()[0] |
1999 itm = self.logTree.selectedItems()[0] |
2006 rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] |
2000 rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] |
2007 tag = itm.text(self.TagsColumn).strip().split(", ", 1)[0] |
2001 tag = itm.text(self.TagsColumn).strip().split(", ", 1)[0] |
2008 res = self.vcs.vcsTag(self.repodir, revision=rev, tagName=tag) |
2002 res = self.vcs.vcsTag(revision=rev, tagName=tag) |
2009 if res: |
2003 if res: |
2010 self.on_refreshButton_clicked() |
2004 self.on_refreshButton_clicked() |
2011 |
2005 |
2012 @pyqtSlot() |
2006 @pyqtSlot() |
2013 def __closeHeadsActTriggered(self): |
2007 def __closeHeadsActTriggered(self): |
2020 if not itm.data(0, self.__incomingRole)] |
2014 if not itm.data(0, self.__incomingRole)] |
2021 revs = [rev for rev in revs if rev in self.__headRevisions] |
2015 revs = [rev for rev in revs if rev in self.__headRevisions] |
2022 if revs: |
2016 if revs: |
2023 closeheadExtension = self.vcs.getExtensionObject("closehead") |
2017 closeheadExtension = self.vcs.getExtensionObject("closehead") |
2024 if closeheadExtension is not None: |
2018 if closeheadExtension is not None: |
2025 closeheadExtension.hgCloseheads( |
2019 closeheadExtension.hgCloseheads(revisions=revs) |
2026 self.repodir, revisions=revs) |
|
2027 |
2020 |
2028 self.on_refreshButton_clicked() |
2021 self.on_refreshButton_clicked() |
2029 |
2022 |
2030 @pyqtSlot() |
2023 @pyqtSlot() |
2031 def __switchActTriggered(self): |
2024 def __switchActTriggered(self): |
2084 self.tr('Enter bookmark name for changeset "{0}":').format( |
2077 self.tr('Enter bookmark name for changeset "{0}":').format( |
2085 changeset), |
2078 changeset), |
2086 QLineEdit.Normal) |
2079 QLineEdit.Normal) |
2087 if ok and bool(bookmark): |
2080 if ok and bool(bookmark): |
2088 self.vcs.hgBookmarkDefine( |
2081 self.vcs.hgBookmarkDefine( |
2089 self.repodir, revision="rev({0})".format(rev), |
2082 revision="rev({0})".format(rev), |
2090 bookmark=bookmark) |
2083 bookmark=bookmark) |
2091 self.on_refreshButton_clicked() |
2084 self.on_refreshButton_clicked() |
2092 |
2085 |
2093 @pyqtSlot() |
2086 @pyqtSlot() |
2094 def __bookmarkMoveActTriggered(self): |
2087 def __bookmarkMoveActTriggered(self): |
2099 if not itm.data(0, self.__incomingRole)]) == 1: |
2092 if not itm.data(0, self.__incomingRole)]) == 1: |
2100 itm = self.logTree.selectedItems()[0] |
2093 itm = self.logTree.selectedItems()[0] |
2101 rev, changeset = ( |
2094 rev, changeset = ( |
2102 itm.text(self.RevisionColumn).strip().split(":", 1) |
2095 itm.text(self.RevisionColumn).strip().split(":", 1) |
2103 ) |
2096 ) |
2104 bookmarksList = self.vcs.hgGetBookmarksList(self.repodir) |
2097 bookmarksList = self.vcs.hgGetBookmarksList() |
2105 bookmark, ok = QInputDialog.getItem( |
2098 bookmark, ok = QInputDialog.getItem( |
2106 self, |
2099 self, |
2107 self.tr("Move Bookmark"), |
2100 self.tr("Move Bookmark"), |
2108 self.tr('Select the bookmark to be moved to changeset' |
2101 self.tr('Select the bookmark to be moved to changeset' |
2109 ' "{0}":').format(changeset), |
2102 ' "{0}":').format(changeset), |
2110 [""] + bookmarksList, |
2103 [""] + bookmarksList, |
2111 0, False) |
2104 0, False) |
2112 if ok and bool(bookmark): |
2105 if ok and bool(bookmark): |
2113 self.vcs.hgBookmarkMove( |
2106 self.vcs.hgBookmarkMove( |
2114 self.repodir, revision="rev({0})".format(rev), |
2107 revision="rev({0})".format(rev), |
2115 bookmark=bookmark) |
2108 bookmark=bookmark) |
2116 self.on_refreshButton_clicked() |
2109 self.on_refreshButton_clicked() |
2117 |
2110 |
2118 @pyqtSlot() |
2111 @pyqtSlot() |
2119 def __lfPullActTriggered(self): |
2112 def __lfPullActTriggered(self): |
2126 rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] |
2119 rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] |
2127 if rev: |
2120 if rev: |
2128 revs.append(rev) |
2121 revs.append(rev) |
2129 |
2122 |
2130 if revs: |
2123 if revs: |
2131 self.vcs.getExtensionObject("largefiles").hgLfPull( |
2124 self.vcs.getExtensionObject("largefiles").hgLfPull(revisions=revs) |
2132 self.repodir, revisions=revs) |
|
2133 |
2125 |
2134 @pyqtSlot() |
2126 @pyqtSlot() |
2135 def __pullActTriggered(self): |
2127 def __pullActTriggered(self): |
2136 """ |
2128 """ |
2137 Private slot to pull changes from a remote repository. |
2129 Private slot to pull changes from a remote repository. |
2145 for itm in [item for item in self.logTree.selectedItems() |
2137 for itm in [item for item in self.logTree.selectedItems() |
2146 if item.data(0, self.__incomingRole)]: |
2138 if item.data(0, self.__incomingRole)]: |
2147 rev = itm.text(self.RevisionColumn).split(":")[1].strip() |
2139 rev = itm.text(self.RevisionColumn).split(":")[1].strip() |
2148 if rev: |
2140 if rev: |
2149 revs.append(rev) |
2141 revs.append(rev) |
2150 shouldReopen = self.vcs.hgPull(self.repodir, revisions=revs) |
2142 shouldReopen = self.vcs.hgPull(revisions=revs) |
2151 refresh = True |
2143 refresh = True |
2152 if self.initialCommandMode == "incoming": |
2144 if self.initialCommandMode == "incoming": |
2153 addNext = True |
2145 addNext = True |
2154 |
2146 |
2155 if shouldReopen: |
2147 if shouldReopen: |
2174 """ |
2166 """ |
2175 itm = self.logTree.selectedItems()[0] |
2167 itm = self.logTree.selectedItems()[0] |
2176 if not itm.data(0, self.__incomingRole): |
2168 if not itm.data(0, self.__incomingRole): |
2177 rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] |
2169 rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] |
2178 if rev: |
2170 if rev: |
2179 self.vcs.hgPush(self.repodir, rev=rev) |
2171 self.vcs.hgPush(rev=rev) |
2180 self.on_refreshButton_clicked( |
2172 self.on_refreshButton_clicked( |
2181 addNext=self.initialCommandMode == "outgoing") |
2173 addNext=self.initialCommandMode == "outgoing") |
2182 |
2174 |
2183 @pyqtSlot() |
2175 @pyqtSlot() |
2184 def __pushAllActTriggered(self): |
2176 def __pushAllActTriggered(self): |
2185 """ |
2177 """ |
2186 Private slot to push all changes to a remote repository. |
2178 Private slot to push all changes to a remote repository. |
2187 """ |
2179 """ |
2188 self.vcs.hgPush(self.repodir) |
2180 self.vcs.hgPush() |
2189 self.on_refreshButton_clicked() |
2181 self.on_refreshButton_clicked() |
2190 |
2182 |
2191 @pyqtSlot() |
2183 @pyqtSlot() |
2192 def __stripActTriggered(self): |
2184 def __stripActTriggered(self): |
2193 """ |
2185 """ |
2195 """ |
2187 """ |
2196 itm = self.logTree.selectedItems()[0] |
2188 itm = self.logTree.selectedItems()[0] |
2197 if not itm.data(0, self.__incomingRole): |
2189 if not itm.data(0, self.__incomingRole): |
2198 rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1] |
2190 rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1] |
2199 shouldReopen = self.vcs.getExtensionObject("strip").hgStrip( |
2191 shouldReopen = self.vcs.getExtensionObject("strip").hgStrip( |
2200 self.repodir, rev=rev) |
2192 rev=rev) |
2201 if shouldReopen: |
2193 if shouldReopen: |
2202 res = E5MessageBox.yesNo( |
2194 res = E5MessageBox.yesNo( |
2203 None, |
2195 None, |
2204 self.tr("Strip Changesets"), |
2196 self.tr("Strip Changesets"), |
2205 self.tr( |
2197 self.tr( |
2219 """ |
2211 """ |
2220 itm = self.logTree.selectedItems()[0] |
2212 itm = self.logTree.selectedItems()[0] |
2221 if not itm.data(0, self.__incomingRole): |
2213 if not itm.data(0, self.__incomingRole): |
2222 rev = "rev({0})".format( |
2214 rev = "rev({0})".format( |
2223 itm.text(self.RevisionColumn).strip().split(":", 1)[0]) |
2215 itm.text(self.RevisionColumn).strip().split(":", 1)[0]) |
2224 self.vcs.vcsMerge(self.repodir, rev=rev) |
2216 self.vcs.vcsMerge("", rev=rev) |
2225 |
2217 |
2226 @pyqtSlot() |
2218 @pyqtSlot() |
2227 def __bundleActTriggered(self): |
2219 def __bundleActTriggered(self): |
2228 """ |
2220 """ |
2229 Private slot to create a changegroup file. |
2221 Private slot to create a changegroup file. |
2278 "revs": revs, |
2270 "revs": revs, |
2279 "base": "", |
2271 "base": "", |
2280 "all": False, |
2272 "all": False, |
2281 } |
2273 } |
2282 |
2274 |
2283 self.vcs.hgBundle(self.repodir, bundleData=bundleData) |
2275 self.vcs.hgBundle(bundleData=bundleData) |
2284 |
2276 |
2285 @pyqtSlot() |
2277 @pyqtSlot() |
2286 def __unbundleActTriggered(self): |
2278 def __unbundleActTriggered(self): |
2287 """ |
2279 """ |
2288 Private slot to apply the currently previewed bundle file. |
2280 Private slot to apply the currently previewed bundle file. |
2289 """ |
2281 """ |
2290 if self.initialCommandMode == "incoming" and bool(self.__bundle): |
2282 if self.initialCommandMode == "incoming" and bool(self.__bundle): |
2291 shouldReopen = self.vcs.hgUnbundle(self.repodir, |
2283 shouldReopen = self.vcs.hgUnbundle(files=[self.__bundle]) |
2292 files=[self.__bundle]) |
|
2293 if shouldReopen: |
2284 if shouldReopen: |
2294 res = E5MessageBox.yesNo( |
2285 res = E5MessageBox.yesNo( |
2295 None, |
2286 None, |
2296 self.tr("Apply Changegroup"), |
2287 self.tr("Apply Changegroup"), |
2297 self.tr("""The project should be reread. Do this now?"""), |
2288 self.tr("""The project should be reread. Do this now?"""), |
2298 yesDefault=True) |
2289 yesDefault=True) |
2299 if res: |
2290 if res: |
2300 e5App().getObject("Project").reopenProject() |
2291 e5App().getObject("Project").reopenProject() |
2301 return |
2292 return |
2302 |
2293 |
2303 self.vcs.vcsLogBrowser(self.repodir) |
2294 self.vcs.vcsLogBrowser() |
2304 self.close() |
2295 self.close() |
2305 |
2296 |
2306 @pyqtSlot() |
2297 @pyqtSlot() |
2307 def __gpgSignActTriggered(self): |
2298 def __gpgSignActTriggered(self): |
2308 """ |
2299 """ |
2314 rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip() |
2305 rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip() |
2315 if rev: |
2306 if rev: |
2316 revs.append(rev) |
2307 revs.append(rev) |
2317 |
2308 |
2318 if revs: |
2309 if revs: |
2319 self.vcs.getExtensionObject("gpg").hgGpgSign( |
2310 self.vcs.getExtensionObject("gpg").hgGpgSign(revisions=revs) |
2320 self.repodir, revisions=revs) |
|
2321 |
2311 |
2322 @pyqtSlot() |
2312 @pyqtSlot() |
2323 def __gpgVerifyActTriggered(self): |
2313 def __gpgVerifyActTriggered(self): |
2324 """ |
2314 """ |
2325 Private slot to verify the signatures of a selected revisions. |
2315 Private slot to verify the signatures of a selected revisions. |
2327 itm = self.logTree.selectedItems()[0] |
2317 itm = self.logTree.selectedItems()[0] |
2328 if not itm.data(0, self.__incomingRole): |
2318 if not itm.data(0, self.__incomingRole): |
2329 rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip() |
2319 rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip() |
2330 if rev: |
2320 if rev: |
2331 self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures( |
2321 self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures( |
2332 self.repodir, rev=rev) |
2322 rev=rev) |
2333 |
2323 |
2334 def __selectAllActTriggered(self, select=True): |
2324 def __selectAllActTriggered(self, select=True): |
2335 """ |
2325 """ |
2336 Private method to select or unselect all log entries. |
2326 Private method to select or unselect all log entries. |
2337 |
2327 |
2683 Private slot to handle selection of a side-by-side link. |
2673 Private slot to handle selection of a side-by-side link. |
2684 |
2674 |
2685 @param link text of the selected link |
2675 @param link text of the selected link |
2686 @type str |
2676 @type str |
2687 """ |
2677 """ |
2688 if ":" in link: |
2678 if ":" in link and self.__filename is not None: |
2689 scheme, path = link.split(":", 1) |
2679 scheme, path = link.split(":", 1) |
2690 if scheme == "sbsdiff" and "_" in path: |
2680 if scheme == "sbsdiff" and "_" in path: |
2691 rev1, rev2 = path.split("_", 1) |
2681 rev1, rev2 = path.split("_", 1) |
2692 self.vcs.hgSbsDiff(self.__filename, revisions=(rev1, rev2)) |
2682 self.vcs.hgSbsDiff(self.__filename, revisions=(rev1, rev2)) |