Added children support to changesets.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Wed, 05 Dec 2012 18:09:53 +0000
changeset 134 565c8bd9c9e8
parent 133 013175ca84d5
child 135 c74b92e6a2f8
Added children support to changesets. HGChangeset>>children returns all child changesets of given one. This can be used to figure out newer changesets.
mercurial/HGChangeset.st
mercurial/HGCommandParser.st
mercurial/HGCommandParserTests.st
mercurial/HGTests.st
mercurial/Make.proto
--- a/mercurial/HGChangeset.st	Wed Dec 05 15:10:10 2012 +0000
+++ b/mercurial/HGChangeset.st	Wed Dec 05 18:09:53 2012 +0000
@@ -1,7 +1,8 @@
 "{ Package: 'stx:libscm/mercurial' }"
 
 HGRepositoryObject subclass:#HGChangeset
-	instanceVariableNames:'id branches author timestamp message parent1 parent2 root'
+	instanceVariableNames:'id branches author timestamp message parent1 parent2 children
+		root'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'SCM-Mercurial-Core'
@@ -77,6 +78,17 @@
     "Created: / 27-11-2012 / 20:40:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+children
+    1 to: children size do:[:i|
+        (children at:i) class == HGChangesetId ifTrue:[
+            children at:i put: (repository changesetWithId: (children at:i))
+        ].
+    ].
+    ^children.
+
+    "Created: / 05-12-2012 / 17:31:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 construct: name
     "Return an HGChangesetFile representing a file 
     (in root of the directory)"
@@ -169,6 +181,12 @@
     "Created: / 27-11-2012 / 20:25:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+setChildren: aCollection
+    children := aCollection
+
+    "Created: / 05-12-2012 / 17:32:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 setId: anHGNodeId
     id := anHGNodeId
 
--- a/mercurial/HGCommandParser.st	Wed Dec 05 15:10:10 2012 +0000
+++ b/mercurial/HGCommandParser.st	Wed Dec 05 18:09:53 2012 +0000
@@ -36,6 +36,7 @@
 '{rev}:{node}
 {branch}
 {parents}
+{children}
 {author}
 {date|isodate}
 {desc}
@@ -43,7 +44,7 @@
 '
 
     "Created: / 12-11-2012 / 23:06:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 13-11-2012 / 17:18:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 05-12-2012 / 17:21:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !HGCommandParser methodsFor:'accessing'!
@@ -176,6 +177,7 @@
     rev setBranches: branches.
     rev setParent1Id: self parseNodeId. self expectSpace.
     rev setParent2Id: self parseNodeId. self expectSpace. self expectLineEnd.
+    rev setChildren: self parseNodeIdList. self expectLineEnd.
     rev setAuthor: self nextLine.
     rev setTimestamp: self parseDate. self expectLineEnd.
     message := String streamContents:[:s|
@@ -191,7 +193,7 @@
     ^rev
 
     "Created: / 13-11-2012 / 09:45:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 27-11-2012 / 20:32:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 05-12-2012 / 17:32:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 parseName
@@ -240,6 +242,24 @@
 
     "Created: / 13-11-2012 / 10:22:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 13-11-2012 / 16:52:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseNodeIdList
+    "Parses node id list from stream and returns it. Support both,
+     short and full node ids."
+
+    | ids |
+
+    stream atEnd ifTrue:[ ^ #() ].
+    stream peek == Character cr ifTrue:[ ^ #() ].
+    ids := OrderedCollection new.
+    [ stream peek ~~ Character cr ] whileTrue:[
+        ids add: self parseNodeId.
+        stream peek == Character space ifTrue:[stream next].
+    ].
+    ^ids
+
+    "Created: / 05-12-2012 / 17:24:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !HGCommandParser methodsFor:'parsing - commands'!
--- a/mercurial/HGCommandParserTests.st	Wed Dec 05 15:10:10 2012 +0000
+++ b/mercurial/HGCommandParserTests.st	Wed Dec 05 18:09:53 2012 +0000
@@ -151,13 +151,14 @@
     "Created: / 13-11-2012 / 16:34:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-test_misc_03
+test_misc_03a
 
     | rev |
 
     rev := (HGCommandParser on: '4:6f88e1f44d9eb86e0b56ca15e30e5d786acd83c7
 default
 3:912a64597e4f133ffbc1fdabdda99167a2d69ce2 -1:0000000000000000000000000000000000000000 
+
 Jan Vrany <jan.vrany@fit.cvut.cz>
 2012-10-17 13:20 +0200
 Commit 4
@@ -167,10 +168,10 @@
     self assert: rev id revno = 4.
     self assert: rev author = 'Jan Vrany <jan.vrany@fit.cvut.cz>'.
     self assert: rev timestamp hour = 13.
-    self assert: rev message = 'Commit 4'
+    self assert: rev message = 'Commit 4'.
+    self assert: (rev instVarNamed:#children) isEmpty.
 
-    "Created: / 13-11-2012 / 17:16:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 21-11-2012 / 18:07:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 05-12-2012 / 17:37:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_misc_03b
@@ -180,6 +181,7 @@
     rev := (HGCommandParser on: '4:6f88e1f44d9eb86e0b56ca15e30e5d786acd83c7
 default
 3:912a64597e4f133ffbc1fdabdda99167a2d69ce2 -1:0000000000000000000000000000000000000000 
+5:3f88e1f44d9e
 Jan Vrany <jan.vrany@fit.cvut.cz>
 2012-10-17 13:20 +0200
 Commit 4
@@ -188,9 +190,36 @@
 ') parseLogEntry.
 
     self assert: rev message = 'Commit 4
-Two lones'
+Two lones'.
+    self assert: (rev instVarNamed:#children) size == 1.
+    self assert: (rev instVarNamed:#children) first revno == 5.
 
     "Created: / 21-11-2012 / 18:09:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 05-12-2012 / 17:38:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_misc_03c
+
+    | rev |
+
+    rev := (HGCommandParser on: '4:6f88e1f44d9eb86e0b56ca15e30e5d786acd83c7
+default
+3:912a64597e4f133ffbc1fdabdda99167a2d69ce2 -1:0000000000000000000000000000000000000000 
+5:3f88e1f44d9e 6:3f88e1f44d9d
+Jan Vrany <jan.vrany@fit.cvut.cz>
+2012-10-17 13:20 +0200
+Commit 4
+Two lones
+**EOE**
+') parseLogEntry.
+
+    self assert: rev message = 'Commit 4
+Two lones'.
+    self assert: (rev instVarNamed:#children) size == 2.
+    self assert: (rev instVarNamed:#children) first revno == 5.
+    self assert: (rev instVarNamed:#children) second revno == 6.
+
+    "Created: / 05-12-2012 / 17:39:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_misc_04
@@ -200,6 +229,7 @@
     revs := (HGCommandParser on: '4:6f88e1f44d9eb86e0b56ca15e30e5d786acd83c7
 default
 3:912a64597e4f133ffbc1fdabdda99167a2d69ce2 -1:0000000000000000000000000000000000000000 
+
 Jan Vrany <jan.vrany@fit.cvut.cz>
 2012-10-17 13:20 +0200
 Commit 4
@@ -207,6 +237,7 @@
 3:912a64597e4f133ffbc1fdabdda99167a2d69ce2
 default
 2:db43a5baa9acaf2536d8b12c070b4f5e0363d45c -1:0000000000000000000000000000000000000000 
+4:6f88e1f44d9e
 Jan Vrany <jan.vrany@fit.cvut.cz>
 2012-10-17 13:20 +0200
 Commit 3
@@ -216,6 +247,7 @@
     self assert: revs size == 2
 
     "Created: / 13-11-2012 / 17:31:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 05-12-2012 / 17:36:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 test_version_2_3_3
--- a/mercurial/HGTests.st	Wed Dec 05 15:10:10 2012 +0000
+++ b/mercurial/HGTests.st	Wed Dec 05 18:09:53 2012 +0000
@@ -246,6 +246,24 @@
     self assert: cs parent2 id revno = 4.
 
     "Created: / 27-11-2012 / 20:54:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_changeset_07
+    "
+    Test accessing changesets
+    "
+
+    | repo cs0 cs1 |
+
+    repo := self repositoryNamed:'test_repo_01'.
+
+    cs0 := repo @ 0.
+    cs1 := repo @ 1.
+
+    self assert: cs0 children size == 1.
+    self assert: (cs0 children includesIdentical: cs1).
+
+    "Created: / 05-12-2012 / 17:41:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !HGTests methodsFor:'tests - commit'!
--- a/mercurial/Make.proto	Wed Dec 05 15:10:10 2012 +0000
+++ b/mercurial/Make.proto	Wed Dec 05 18:09:53 2012 +0000
@@ -96,9 +96,7 @@
 # copy state changes. Together with --guessVersion it ensures that package
 # definition class always contains correct binary revision string.
 ifneq (**NOHG**, $(shell hg root 2> /dev/null || echo -n '**NOHG**'))
-
-stx_libscm_mercurial.$(O): $(shell hg root)/.hg/dirstate	
-
+stx_libscm_mercurial.$(O): $(shell hg root)/.hg/dirstate
 endif