mercurial/HGRepositoriesResource.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 08 Jan 2019 09:35:11 +0000
changeset 866 8a885a75daa9
parent 748 2c10fc567727
permissions -rw-r--r--
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!