Evolve: Added support for loading hidden changesets.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Tue, 22 Mar 2016 20:10:39 +0000
changeset 655 d16442a5751c
parent 605 96fd9746c9ed
child 656 2fd0838b5500
Evolve: Added support for loading hidden changesets. This is necessary to work on repositories where evolve enabled and used. The pre-loading of changesets may result in an attempt to load a hidden changeset. In that case the `hg log` command barks and refuses to print the log. In turn, operations on repository may spuriously fail because of this. To avoid this, make sure `--hidden` option is passed to log command if using Mercurial >= 2.5 (2.5 is the first supporting `--hidden` option)
mercurial/HGCommand.st
mercurial/HGRepository.st
mercurial/HGTests.st
--- a/mercurial/HGCommand.st	Tue Mar 01 19:55:28 2016 +0000
+++ b/mercurial/HGCommand.st	Tue Mar 22 20:10:39 2016 +0000
@@ -24,7 +24,9 @@
 	instanceVariableNames:'workingDirectory result error errors blocker errorReader
 		outputReader'
 	classVariableNames:'HGCommandString HGExecutable HGExecutableArguments HGVersion
-		HGVersionIsGreaterThan_2_4 HGVersionIsGreaterThan_3_3'
+		HGVersionIsGreaterOrEqualThan_2_4
+		HGVersionIsGreaterOrEqualThan_2_5
+		HGVersionIsGreaterOrEqualThan_3_3'
 	poolDictionaries:'HGDebugFlags'
 	category:'SCM-Mercurial-Internal'
 !
@@ -107,7 +109,7 @@
 !
 
 HGCommand subclass:#log
-	instanceVariableNames:'start stop path childrenOnly idsOnly revsets limit'
+	instanceVariableNames:'start stop path childrenOnly idsOnly revsets limit hidden'
 	classVariableNames:''
 	poolDictionaries:''
 	privateIn:HGCommand
@@ -284,7 +286,8 @@
 
 hgCommand: command
     HGCommandString := command notNil ifTrue:[ command asString ] ifFalse:[ nil ].
-    HGExecutable := HGExecutableArguments := HGVersion := HGVersionIsGreaterThan_2_4 := nil.
+    HGExecutable := HGExecutableArguments := HGVersion := nil.
+    HGVersionIsGreaterOrEqualThan_2_4 := HGVersionIsGreaterOrEqualThan_2_5 := HGVersionIsGreaterOrEqualThan_3_3 := nil.
 
 
     "
@@ -295,7 +298,7 @@
     "
 
     "Created: / 19-11-2012 / 21:49:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 01-12-2014 / 20:38:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 25-03-2016 / 17:25:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 hgCommandValidate: command
@@ -414,22 +417,32 @@
 !
 
 hgVersionIsGreaterOrEqualThan_2_4
-    HGVersionIsGreaterThan_2_4 isNil ifTrue:[
-        HGVersionIsGreaterThan_2_4 := self hgVersionIsGreaterOrEqualThan:#( 2 4 ).
+    HGVersionIsGreaterOrEqualThan_2_4 isNil ifTrue:[
+        HGVersionIsGreaterOrEqualThan_2_4 := self hgVersionIsGreaterOrEqualThan:#( 2 4 ).
     ].
-    ^ HGVersionIsGreaterThan_2_4
+    ^ HGVersionIsGreaterOrEqualThan_2_4
 
     "Created: / 27-11-2014 / 23:16:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 01-12-2014 / 20:39:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 25-03-2016 / 17:22:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+hgVersionIsGreaterOrEqualThan_2_5
+    HGVersionIsGreaterOrEqualThan_2_5 isNil ifTrue:[
+        HGVersionIsGreaterOrEqualThan_2_5 := self hgVersionIsGreaterOrEqualThan:#( 2 5 ).
+    ].
+    ^ HGVersionIsGreaterOrEqualThan_2_5
+
+    "Created: / 25-03-2016 / 17:23:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 hgVersionIsGreaterOrEqualThan_3_3
-    HGVersionIsGreaterThan_3_3 isNil ifTrue:[
-        HGVersionIsGreaterThan_3_3 := self hgVersionIsGreaterOrEqualThan:#( 3 3 ).
+    HGVersionIsGreaterOrEqualThan_3_3 isNil ifTrue:[
+        HGVersionIsGreaterOrEqualThan_3_3 := self hgVersionIsGreaterOrEqualThan:#( 3 3 ).
     ].
-    ^ HGVersionIsGreaterThan_3_3
+    ^ HGVersionIsGreaterOrEqualThan_3_3
 
     "Created: / 14-09-2015 / 05:42:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 25-03-2016 / 17:23:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 hgVersionIsSupported
@@ -1885,6 +1898,14 @@
     childrenOnly := aBoolean.
 !
 
+hidden
+    ^ hidden
+!
+
+hidden:aBoolean
+    hidden := aBoolean.
+!
+
 idsOnly
     ^ idsOnly
 !
@@ -1981,6 +2002,20 @@
     "Modified: / 27-11-2014 / 23:24:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+argumentsGlobalOn:arg
+    "Called to get global options"
+
+    hidden == true ifTrue:[
+        "/ --hidden is supported since 2.5
+        HGCommand hgVersionIsGreaterOrEqualThan_2_5 ifTrue:[
+            arg nextPut: '--hidden'
+        ].
+    ].
+
+    "Created: / 22-03-2016 / 20:02:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 25-03-2016 / 17:25:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 parseError:stream
     "Parses output of 'hg' command, i.e. commit, log, update, checkout,
      etc."
--- a/mercurial/HGRepository.st	Tue Mar 01 19:55:28 2016 +0000
+++ b/mercurial/HGRepository.st	Tue Mar 22 20:10:39 2016 +0000
@@ -143,6 +143,7 @@
 
     "Created: / 14-11-2012 / 22:46:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 21-11-2012 / 00:20:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 25-03-2016 / 17:27:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 clone: aFilenameOrUrlOrString to: aStringOrFilename update: update
@@ -862,6 +863,35 @@
 
 !HGRepository methodsFor:'testing'!
 
+hasExtension: extension
+    "Return true, if the repository has `extension` enabled, false otherwise"
+
+    | extensions value |
+
+    extensions := self config get: 'extensions' default: nil.
+    extensions notNil ifTrue:[ 
+        value := extensions get: extension default: 0.
+        value ~~ 0 ifTrue:[ 
+            ^value isEmptyOrNil or:[ value asFilename exists ]
+        ].
+    ].
+    ^ false
+
+    "
+    (HGRepository on: (Smalltalk getPackageDirectoryForPackage: #'stx:libscm')) hasExtension: 'evolve'
+    "
+
+    "Created: / 16-03-2016 / 23:56:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+hasExtensionEvolve
+    "Return true, if evolve extension is enabled on the receiver"
+
+    ^ self hasExtension:'evolve'
+
+    "Created: / 16-03-2016 / 23:57:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 isShared
     "Return true, if this repository is shared, i.e., created by means
      of `hg share`"
@@ -994,10 +1024,13 @@
      non-lazy"
 
      | csets cs |
-     csets := self repository execute:
+     csets := repository execute:
                     (HGCommand log
                         workingDirectory: repository path asString;
                         revsets: (self loadRevsetsForLoad: id);
+                        hidden: true; "/ Hidden changeset are supported since 2.5, but
+                                      "/ the HGCommand::log cares of this itself, so it's
+                                      "/ safe to pass true here.
                         yourself).
      "/just to be defensive...
      csets do:[:each| 
@@ -1020,7 +1053,7 @@
     ^cs
 
     "Created: / 16-12-2012 / 00:57:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 03-03-2013 / 22:58:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 25-03-2016 / 17:26:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 loadRevsetsForLoad: id
--- a/mercurial/HGTests.st	Tue Mar 01 19:55:28 2016 +0000
+++ b/mercurial/HGTests.st	Tue Mar 22 20:10:39 2016 +0000
@@ -1217,6 +1217,24 @@
     "Created: / 09-12-2012 / 23:01:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+test_hasExtension
+    "
+    Tests HGRepository>>hasExtension:.
+    Since we cannot guarantee that the system under test will
+    have the extension enabled, just test for errors (DNU)
+    "
+
+    | repo |
+
+    repo := self repositoryNamed:'test_repo_02'.           
+    "/ This one is likely not enabled...
+    self assert: (repo hasExtension: 'blablablalibscm' , Random nextInteger printString) not.
+    repo hasExtension: 'purge'.
+    repo hasExtension: 'evolve'.
+
+    "Created: / 22-03-2016 / 19:56:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 test_heads_01
     "
     Test listing repository heads