Issue 256: fix parsing branch name from changelog
To retrieve a branch of an changeset, `stx:libscm` uses `{branch}`
branch keyword and then parses it as "name list". However, according
to documentation it is a single string:
branch String. The name of the branch on which the changeset was
committed.
This obviously caused problems when branch name had spaces in it.
This commit fixes the problem.
One remaining thing is that `stx:libscm` technically allows a changeset
to be in more than one branch which seems to be impossible in
Mercurial itself. This should be investigated and fixed, eventually.
"
stx:libscm - a new source code management library for Smalltalk/X
Copyright (C) 2012-2015 Jan Vrany
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
"
"{ Package: 'stx:libscm/mercurial' }"
"{ NameSpace: Smalltalk }"
TestResource subclass:#HGRepositoriesResource
instanceVariableNames:'repositoryDirectoryRoot repositoryDirectory'
classVariableNames:'HGRepositoriesArchiveDir'
poolDictionaries:''
category:'SCM-Mercurial-Tests'
!
!HGRepositoriesResource class methodsFor:'documentation'!
copyright
"
stx:libscm - a new source code management library for Smalltalk/X
Copyright (C) 2012-2015 Jan Vrany
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
"
!
documentation
"
This resouce provides some pre-created respositories to run tests
against.
== test_repo_01 ========================================
@ changeset: 4:6f88e1f44d9e
| tag: tip
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Wed Oct 17 13:20:53 2012 +0200
| summary: Commit 4
|
o changeset: 3:912a64597e4f
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Wed Oct 17 13:20:38 2012 +0200
| summary: Commit 3
|
o changeset: 2:db43a5baa9ac
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Wed Oct 17 13:20:18 2012 +0200
| summary: Commit 2
|
o changeset: 1:98087d77fbaa
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Wed Oct 17 13:19:14 2012 +0200
| summary: Commit 1
|
o changeset: 0:98b9033d3bac
user: Jan Vrany <jan.vrany@fit.cvut.cz>
date: Wed Oct 17 13:18:37 2012 +0200
summary: Commit 0
== test_repo_02 ========================================
@ changeset: 5:f22945219f9b
|\ tag: tip
| | parent: 0:c81883a66d71
| | parent: 4:5bd21fb5eea8
| | user: Jan Vrany <jan.vrany@fit.cvut.cz>
| | date: Tue Nov 27 18:16:25 2012 +0000
| | summary: Commit 5 (merged branch1)
| |
| o changeset: 4:5bd21fb5eea8
| | branch: branch1
| | parent: 1:60544c149e47
| | user: Jan Vrany <jan.vrany@fit.cvut.cz>
| | date: Tue Nov 27 18:15:31 2012 +0000
| | summary: Commit 4
| |
| | o changeset: 3:32d32dee719f
| | | branch: branch2
| | | user: Jan Vrany <jan.vrany@fit.cvut.cz>
| | | date: Tue Nov 27 18:12:40 2012 +0000
| | | summary: Commit 3 (branch2 is dead-end)
| | |
+---o changeset: 2:d67d1ec9e26d
| | branch: branch2
| | parent: 0:c81883a66d71
| | user: Jan Vrany <jan.vrany@fit.cvut.cz>
| | date: Tue Nov 27 18:12:03 2012 +0000
| | summary: Commit 2 (create branch2 & modified file)
| |
| o changeset: 1:60544c149e47
|/ branch: branch1
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Tue Nov 27 18:10:36 2012 +0000
| summary: Commit 1 (created branch1)
|
o changeset: 0:c81883a66d71
user: Jan Vrany <jan.vrany@fit.cvut.cz>
date: Tue Nov 27 18:09:47 2012 +0000
summary: Commit 0
== mocks_hg_p1 ========================================
@ changeset: 1:847b035d9aed
| tag: tip
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Wed Jan 29 13:56:10 2014 +0000
| summary: Package name and version_HG fixed
|
o changeset: 0:99acfa83a3bf
user: Jan Vrany <jan.vrany@fit.cvut.cz>
date: Fri Nov 16 11:29:05 2012 +0000
summary: Initial commit
== mocks_hg_p2 ========================================
@ changeset: 3:9e9134b80dfa
| tag: tip
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Sat Dec 01 15:42:22 2012 +0000
| summary: - MocksHgP2N2N21Foo
|
o changeset: 2:84a2ca31f8d9
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Sat Dec 01 15:42:04 2012 +0000
| summary: - mocks_hg_p2_n2
|
o changeset: 1:efa1cc55f9f9
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Sat Dec 01 15:41:47 2012 +0000
| summary: - MocksHgP2N1Foo
|
o changeset: 0:a662a0c5d8dd
user: Jan Vrany <jan.vrany@fit.cvut.cz>
date: Sat Dec 01 15:41:22 2012 +0000
summary: - mocks_hg_p2
== mocks_hg_p3 ========================================
o changeset: 2:54cd319e4818
| branch: branch1
| tag: tip
| parent: 0:01f38ab5d98c
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Mon Jan 14 14:47:02 2013 +0000
| summary: Branch 1
|
| o changeset: 1:54db7f7bc5b0
|/ user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Mon Jan 14 14:43:07 2013 +0000
| summary: changed:
|
@ changeset: 0:01f38ab5d98c
user: Jan Vrany <jan.vrany@fit.cvut.cz>
date: Mon Jan 14 14:07:24 2013 +0000
summary: Initial package contents
== mocks_hg_p4 ========================================
@ changeset: 0:a0b5785fb55a
tag: tip
user: Jan Vrany <jan.vrany@fit.cvut.cz>
date: Wed Mar 27 11:31:36 2013 +0000
summary: Initial commit
== mocks_hg_p5 ========================================
@ changeset: 1:5abd9179e43d
| tag: tip
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Fri Nov 29 16:16:27 2013 +0000
| summary: Added standard Java bundle
|
o changeset: 0:07139f6f7907
user: Jan Vrany <jan.vrany@fit.cvut.cz>
date: Fri Nov 29 16:09:27 2013 +0000
summary: Initial commit
== mocks_hg_p6 ========================================
o changeset: 6:7d0045fb7dba
| tag: tip
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Tue Feb 11 10:44:38 2014 +0000
| summary: Removed extension method Object>>#greet
|
o changeset: 5:ef448ae1bbbd
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Tue Feb 11 10:43:51 2014 +0000
| summary: Added extension method Object>>#greet.
|
o changeset: 4:f71dfc6c6f9b
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Tue Feb 11 10:39:47 2014 +0000
| summary: MocksHGP6Bar>>#bar renamed to #greet
|
o changeset: 3:c751cced3329
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Tue Feb 11 10:37:44 2014 +0000
| summary: Removed class MocksHGP6Foo.
|
o changeset: 2:581b3cabbf8f
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Tue Feb 11 10:36:53 2014 +0000
| summary: Added new class MocksHGP6Qux
|
o changeset: 1:506702fda231
| user: Jan Vrany <jan.vrany@fit.cvut.cz>
| date: Tue Feb 11 10:34:13 2014 +0000
| summary: MocksHGP6Bar refactored
|
o changeset: 0:c76faa501252
user: Jan Vrany <jan.vrany@fit.cvut.cz>
date: Tue Feb 11 12:53:12 2014 +0000
summary: Initial commit
[author:]
Jan Vrany <jan.vrany@fit.cvut.cz>
[instance variables:]
[class variables:]
[see also:]
"
! !
!HGRepositoriesResource class methodsFor:'class initialization'!
initialize
HGRepositoriesArchiveDir := (Smalltalk getPackageDirectoryForPackage:self package)
/ 'tests' / 'repositories'
"Created: / 09-12-2010 / 23:07:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified (format): / 27-12-2011 / 18:07:34 / dundee"
"Modified: / 13-07-2016 / 17:54:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!HGRepositoriesResource methodsFor:'accessing'!
directoryForRepositoryNamed: nm
^self directoryForRepositoryNamed: nm unpack: true
"Created: / 19-09-2012 / 18:57:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 14-01-2013 / 13:13:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
directoryForRepositoryNamed: nm init: init
"Returns path to repository named nm.
If `init` is true, then the repository is created and initialized
(with no content at all). If 'init' is false, then only directory
name is returned (without creating it)."
^self directoryForRepositoryNamed: nm unpack: false init: init
"Created: / 01-02-2013 / 13:38:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
directoryForRepositoryNamed: nm revision: revision
^self directoryForRepositoryNamed: nm unpack: true revision: revision
"Created: / 11-02-2014 / 11:16:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
directoryForRepositoryNamed: nm unpack: unpack
"Returns path to repository named nm.
If `unpack` is true, then the repository is frechly created and thus
empty. If 'unpack' is true, then initial content of repository will
be loaded from zip archive located in
<package path>/stx/libsvn/tests/repositories/<name>.git.zip
If the files does not exists, an error is raised"
^self directoryForRepositoryNamed: nm unpack: unpack init: true
"Created: / 14-01-2013 / 13:13:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 01-02-2013 / 13:39:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
directoryForRepositoryNamed: nm unpack: unpack init: init
"Returns path to repository named nm.
If `unpack` is true, then the repository is frechly created and thus
empty, unless 'init' is false (in that case, only a name of directory
that does not exists yet ir returned.
If 'unpack' is true, then initial content of repository will
be loaded from zip archive located in
<package path>/stx/libsvn/tests/repositories/<name>.git.zip
If the files does not exists, an error is raised"
^ self directoryForRepositoryNamed: nm unpack: unpack init: init revision: nil
"Created: / 01-02-2013 / 13:35:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 11-02-2014 / 11:12:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
directoryForRepositoryNamed: nm unpack: unpack init: init revision: revision
"Returns path to repository named nm.
If `unpack` is true, then the repository is frechly created and thus
empty, unless 'init' is false (in that case, only a name of directory
that does not exists yet ir returned.
If 'unpack' is true, then initial content of repository will
be loaded from zip archive located in
<package path>/stx/libsvn/tests/repositories/<name>.git.zip
If the files does not exists, an error is raised.
If `revision` is not nil, then update working copy to specified revision,
otherwise keep it as it is. Note, that `revision` is only valid if
`unpack` is true. If not and `revision` is not nil, error is raised.
"
| archiveNm archive repo dir ok runningUnderJenkins |
"/ runningUnderJenkins := (OperatingSystem getEnvironment:'JENKINS_SERVER_COOKIE') notNil.
"/ runningUnderJenkins := true.
runningUnderJenkins := false.
unpack ifTrue:[
self assert: init description: 'Cannot unpack non-initialized repo!!'
].
archiveNm := nm copy
replaceAll:$/ with:$_;
yourself.
archive := HGRepositoriesArchiveDir / (archiveNm , '.hg.zip').
unpack ifTrue:[
self assert:archive exists description:'dump file does not exist'.
].
dir := repositoryDirectory.
self assert:dir exists description:'repository directory does not exist'.
init ifFalse:[
^ (dir asAbsoluteFilename / nm) pathName.
].
unpack ifTrue:[
ok := true.
OperatingSystem
executeCommand:('unzip %1' bindWith: (archive asAbsoluteFilename pathName))
inputFrom: nil
outputTo: (runningUnderJenkins ifTrue:[ Stdout ] ifFalse:[ nil ])
errorTo: (runningUnderJenkins ifTrue:[ Stderr ] ifFalse:[ nil ])
inDirectory:dir
onError:[:status |
Stdout nextPutLine: ('Oops, unzip command failed: pid=%1 status=%2, code=%3' bindWith: status status with: status code with: status pid).
ok := false
].
ok ifFalse:[
self tearDownRepositoryDirectory.
self setUpRepositoryDirectory.
dir := repositoryDirectoryRoot.
OperatingSystem
executeCommand:('unzip %1' bindWith: (archive asAbsoluteFilename pathName))
inputFrom: nil
outputTo: (runningUnderJenkins ifTrue:[ Stdout ] ifFalse:[ nil ])
errorTo: (runningUnderJenkins ifTrue:[ Stderr ] ifFalse:[ nil ])
inDirectory:dir
onError:[:status |
Stdout nextPutLine: ('Oops, unzip command second attempt failed: pid=%1 status=%2, code=%3' bindWith: status status with: status code with: status pid).
self assert:false description:('unzip command second attempt failed: pid=%1 status=%2, code=%3' bindWith: status status with: status code with: status pid).
].
].
revision notNil ifTrue:[
OperatingSystem
executeCommand:('hg update -r %1' bindWith: revision)
inputFrom: nil
outputTo: (runningUnderJenkins ifTrue:[ Stdout ] ifFalse:[ nil ])
errorTo: (runningUnderJenkins ifTrue:[ Stderr ] ifFalse:[ nil ])
inDirectory:(dir asAbsoluteFilename / nm)
onError:[:status | self assert:false description:('hg uppdate -r %1 failed' bindWith: revision)].
].
] ifFalse:[
| repodir |
self assert: revision isNil description:'unpack is false but revision given'.
repodir := (dir asAbsoluteFilename / nm).
repodir directory recursiveMakeDirectory.
ok := true.
self assert: repodir directory exists description: ('failed to make directory %1' bindWith: repodir pathName).
OperatingSystem
executeCommand:('hg init %1' bindWith: (repodir baseName))
inputFrom: nil
outputTo: (runningUnderJenkins ifTrue:[ Stdout ] ifFalse:[ nil ])
errorTo: (runningUnderJenkins ifTrue:[ Stderr ] ifFalse:[ nil ])
inDirectory:repodir directory pathName
onError:[:status |
Stdout nextPutLine: ('`hg init` command failed: pid=%1 status=%2, code=%3' bindWith: status status with: status code).
ok := false.
].
ok := ok and:[(repodir / '.hg') exists].
ok ifFalse:[
self tearDownRepositoryDirectory.
self setUpRepositoryDirectory.
dir := repositoryDirectoryRoot.
repodir := (dir asAbsoluteFilename / nm).
repodir directory recursiveMakeDirectory.
OperatingSystem
executeCommand:('hg init %1' bindWith: (repodir baseName))
inputFrom: nil
outputTo: (runningUnderJenkins ifTrue:[ Stdout ] ifFalse:[ nil ])
errorTo: (runningUnderJenkins ifTrue:[ Stderr ] ifFalse:[ nil ])
inDirectory:repodir directory pathName
onError:[:status |
Stdout nextPutLine: ('`hg init` command failed: pid=%1 status=%2, code=%3' bindWith: status status with: status code).
self assert:false description:'`hg init` second atempt failed'
].
].
self assert: (repodir / '.hg') exists description: ('repository initialized but no .hg found in %1' bindWith: repodir pathName).
].
repo := (dir asAbsoluteFilename / nm).
runningUnderJenkins ifTrue:[
Stdout nextPutLine: ('contents of repositoryDirectory=%1' bindWith: dir asAbsoluteFilename pathName).
OperatingSystem
executeCommand:('ls -lR %1' bindWith: dir asAbsoluteFilename pathName)
inputFrom: nil
outputTo: Stdout
errorTo: Stderr.
Stdout nextPutLine: ('contents enc').
].
self assert: repo exists.
self assert: (repo / '.hg') exists.
^repo pathName
"Created: / 11-02-2014 / 11:12:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 08-02-2017 / 10:17:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 13-02-2017 / 21:32:59 / vranyj1"
!
directoryForRepositoryNamed: nm unpack: unpack revision: revision
"Returns path to repository named nm.
If `unpack` is true, then the repository is frechly created and thus
empty. If 'unpack' is true, then initial content of repository will
be loaded from zip archive located in
<package path>/stx/libsvn/tests/repositories/<name>.git.zip
If the files does not exists, an error is raised.
If `revision` is not nil, then update working copy to specified revision,
otherwise keep it as it is. Note, that `revision` is only valid if
`unpack` is true. If not and `revision` is not nil, error is raised.
"
^self directoryForRepositoryNamed: nm unpack: unpack init: true revision: revision
"Created: / 11-02-2014 / 11:12:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!HGRepositoriesResource methodsFor:'running'!
setUp
repositoryDirectoryRoot := Filename newTemporaryDirectory.
"Created: / 09-12-2010 / 23:53:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified (format): / 27-12-2011 / 18:07:04 / dundee"
"Modified: / 08-02-2017 / 09:46:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
setUpRepositoryDirectory
repositoryDirectory := Filename newTemporaryDirectoryIn: repositoryDirectoryRoot.
Smalltalk packagePath: (Smalltalk packagePath asOrderedCollection
addFirst: repositoryDirectory pathName;
yourself)
"Created: / 08-02-2017 / 09:46:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
tearDown
self tearDownRepositoryDirectory.
[
repositoryDirectoryRoot recursiveRemove
] on: Error do:[
"Stupid windows!!"
]
"Created: / 09-12-2010 / 23:54:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 30-09-2012 / 05:26:04 / jv"
"Modified: / 08-02-2017 / 10:12:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
tearDownRepositoryDirectory
repositoryDirectory notNil ifTrue:[
Smalltalk packagePath: (Smalltalk packagePath asOrderedCollection
remove: repositoryDirectory pathName;
yourself).
].
repositoryDirectory := nil.
"Created: / 08-02-2017 / 09:47:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!HGRepositoriesResource methodsFor:'testing'!
isAvailable
^HGRepositoriesArchiveDir exists and:[OperatingSystem canExecuteCommand:'unzip']
"Created: / 09-12-2010 / 23:06:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified (format): / 27-12-2011 / 18:05:57 / dundee"
"Modified: / 17-10-2012 / 13:02:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!HGRepositoriesResource class methodsFor:'documentation'!
version_HG
^ '$Changeset: <not expanded> $'
!
version_SVN
^ 'Id:: '
! !
HGRepositoriesResource initialize!