# HG changeset patch # User Jan Vrany # Date 1468430950 -3600 # Node ID c3cb04bed33847502183551d055a612c8ba243bd # Parent 744539f5b8c794696994f31fe2a815678297a803 Fixed a bug in changeset id parsing The changeset id parsing logic can parse both, revision numbers and changeset id (hashes). It may happen, however, that a short id (12 chars) may consist of digits only (like "087537207973"). In that case it considered it being a revno which lead to an error. This is hard to disambiguate without querying the repo. However, it seems more appropriate to treat it as id when the maybe-revno is 12 digits and more in length. If it would be a revno, then the repo would contain at least 10^11 revisions. diff -r 744539f5b8c7 -r c3cb04bed338 mercurial/HGChangesetId.st --- a/mercurial/HGChangesetId.st Mon Jun 27 12:00:16 2016 +0100 +++ b/mercurial/HGChangesetId.st Wed Jul 13 18:29:10 2016 +0100 @@ -138,10 +138,11 @@ "Parses node id from stream and returns it. Support both, short and full node ids" - | stream c c1 c2 sign revno hash hashPos short | + | stream c c1 c2 sign revno hash hashPos charPos short | hash := ByteArray new: 20. hashPos := 1. + charPos := 0. short := true. revno := 0. @@ -168,9 +169,22 @@ c1 := c2 := nil. ]. stream next. + charPos := charPos + 1. ]. revno := revno * sign. - (stream atEnd or:[stream peek isSeparator]) ifTrue:[ + stream atEnd ifTrue:[ + "/ We might have read revno or a short hash that by chance + "/ consist of only digits and not leading with 0. In this case + "/ we actually cannot distinguish. + "/ In case we have read less than 12 characters (size of a short id), + "/ treat it as revno. A conservative guess... + charPos < 12 ifTrue:[ + ^(HGChangesetId new: 0) + revno: revno; + yourself + ] + ]. + (stream atEnd not and:[stream peek isSeparator]) ifTrue:[ ^(HGChangesetId new: 0) revno: revno; yourself @@ -257,7 +271,7 @@ " "Created: / 13-11-2012 / 16:49:19 / Jan Vrany " - "Modified: / 22-01-2013 / 12:00:18 / Jan Vrany " + "Modified: / 13-07-2016 / 18:15:12 / Jan Vrany " ! ! !HGChangesetId class methodsFor:'accessing'! diff -r 744539f5b8c7 -r c3cb04bed338 mercurial/HGCommitTask.st --- a/mercurial/HGCommitTask.st Mon Jun 27 12:00:16 2016 +0100 +++ b/mercurial/HGCommitTask.st Wed Jul 13 18:29:10 2016 +0100 @@ -185,8 +185,10 @@ ]. "/ If working copy us not shared or when using Mercurial < 3.3 (which does not support "/ sharing of bookmarks), also set the bookmark on package working copy. - (wc repository isShared not or:[ HGCommand hgVersionIsGreaterOrEqualThan_3_3 not]) ifTrue:[ - repository bookmark: wc changesetId as: bookmark. + bookmark notNil ifTrue:[ + (wc repository isShared not or:[ HGCommand hgVersionIsGreaterOrEqualThan_3_3 not]) ifTrue:[ + repository bookmark: wc changesetId as: bookmark. + ]. ]. remote notNil ifTrue:[ diff -r 744539f5b8c7 -r c3cb04bed338 mercurial/HGRepositoriesResource.st --- a/mercurial/HGRepositoriesResource.st Mon Jun 27 12:00:16 2016 +0100 +++ b/mercurial/HGRepositoriesResource.st Wed Jul 13 18:29:10 2016 +0100 @@ -259,12 +259,12 @@ initialize - HGRepositoriesArchiveDir := (Smalltalk packageDirectoryForPackageId:self package) + HGRepositoriesArchiveDir := (Smalltalk getPackageDirectoryForPackage:self package) / 'tests' / 'repositories' "Created: / 09-12-2010 / 23:07:08 / Jan Vrany " "Modified (format): / 27-12-2011 / 18:07:34 / dundee" - "Modified: / 17-10-2012 / 13:02:22 / Jan Vrany " + "Modified: / 13-07-2016 / 17:54:01 / Jan Vrany " ! ! !HGRepositoriesResource methodsFor:'accessing'! diff -r 744539f5b8c7 -r c3cb04bed338 mercurial/HGStXTests.st --- a/mercurial/HGStXTests.st Mon Jun 27 12:00:16 2016 +0100 +++ b/mercurial/HGStXTests.st Wed Jul 13 18:29:10 2016 +0100 @@ -2388,13 +2388,13 @@ "/ build.xml "/ build.auto.xml "/ .hgignore - self assert: (changeset changes select:[:change | change isAdded ]) size == 4. + self assert: (changeset changes select:[:change | change isAdded ]) size == 5. self assert: (changeset / 'java' / 'src' / 'mocks' / 'hg' / 'p5' / 'Foo.java' ) notNil. "Created: / 04-08-2014 / 01:42:13 / Jan Vrany " - "Modified (format): / 20-01-2015 / 11:36:18 / Jan Vrany " + "Modified: / 13-07-2016 / 20:39:40 / Jan Vrany " ! test_commit_java_01b @@ -2446,12 +2446,12 @@ "/ build.xml "/ build.auto.xml "/ .hgignore - self assert: (changeset changes select:[:change | change isAdded ]) size == 4. + self assert: (changeset changes select:[:change | change isAdded ]) size == 5. self assert: (changeset / 'java' / 'src' / 'mocks' / 'hg' / 'p5' / 'Foo.java' ) notNil. "Created: / 04-08-2014 / 01:43:06 / Jan Vrany " - "Modified: / 20-01-2015 / 11:36:30 / Jan Vrany " + "Modified: / 13-07-2016 / 20:39:53 / Jan Vrany " ! test_commit_java_01c diff -r 744539f5b8c7 -r c3cb04bed338 mercurial/HGTests.st --- a/mercurial/HGTests.st Mon Jun 27 12:00:16 2016 +0100 +++ b/mercurial/HGTests.st Wed Jul 13 18:29:10 2016 +0100 @@ -1532,16 +1532,21 @@ "/Only hash id := HGChangesetId fromString:'6f88e1f44d9eb86e0b56ca15e30e5d786acd83c7'. - self assert: id revno = nil. "/meaning - unknown. + self assert: id revno isNil. "/meaning - unknown. self assert: id asByteArray = #[111 136 225 244 77 158 184 110 11 86 202 21 227 14 93 120 106 205 131 199]. "/Only short hash id := HGChangesetId fromString:'6f88e1f44d9e'. - self assert: id revno = nil. "/meaning - unknown. - self assert: id asByteArray = #[111 136 225 244 77 158] + self assert: id revno isNil. "/meaning - unknown. + self assert: id asByteArray = #[111 136 225 244 77 158]. + + "/Short hash that looks like a revno only + id := HGChangesetId fromString:'087537207973'. + self assert: id revno isNil. "/meaning - unknown. + self assert: id asByteArray = #[16r08 16r75 16r37 16r20 16r79 16r73]. "Created: / 16-11-2012 / 21:27:45 / Jan Vrany " - "Modified: / 22-01-2013 / 12:31:19 / Jan Vrany " + "Modified: / 13-07-2016 / 17:54:52 / Jan Vrany " ! test_nodeid_02