mercurial/HGWorkingCopy.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 10 Dec 2012 03:43:12 +0000
changeset 152 9068fe7a5795
parent 146 1015b8f6dc1c
child 156 725d8bc65e48
permissions -rw-r--r--
Support for commiting to a new branch. When commiting, a branch in which to commit may be specified. The branch must not exists.

"{ Package: 'stx:libscm/mercurial' }"

HGRepositoryObject subclass:#HGWorkingCopy
	instanceVariableNames:'root'
	classVariableNames:''
	poolDictionaries:''
	category:'SCM-Mercurial-Core'
!


!HGWorkingCopy methodsFor:'accessing'!

branch
    "Return currently checked-out branch"

    | name |

    name := 'default'.
    (root asFilename / '.hg' / 'branch') exists ifTrue:[
        "File DOES contain trailing newline"    
        name := (root asFilename / '.hg' / 'branch') contents first.
    ].
    ^repository branchWithName: name.

    "Created: / 27-11-2012 / 13:51:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

branch: aStringOrHGBranch
    "Set branch for subsequent commits. Returns new branch as HGBranch"

    | name |

    name := aStringOrHGBranch asString.

    self branch name = name ifTrue:[ ^ self ].

    (root asFilename / '.hg' / 'branch') exists ifTrue:[
        (root asFilename / '.hg' / 'branch') 
            copyTo: (root asFilename / '.hg' / 'undo.branch')
    ] ifFalse:[
        "File DOES contain trailing newline"
        (root asFilename / '.hg' / 'undo.branch') writingFileDo:[:s|
            s nextPutLine: 'default'.
        ]    
    ].
    (root asFilename / '.hg' / 'branch') writingFileDo:[:s|
        s nextPutLine: name.
    ].

    "Return HGBranch here"
    ^ aStringOrHGBranch isString ifFalse:[
        aStringOrHGBranch
    ] ifTrue:[
        repository branchWithName: name createIfAbsent: true.
    ]

    "Created: / 10-12-2012 / 03:04:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeset
    "Return an HGChangeset representing the checked-out changeset
     (revision) of the receiver"

    | id dirstate |

    dirstate := root asFilename / '.hg' / 'dirstate'.
    dirstate exists ifFalse:[ 
        "No changeset yet - fresh repository"
        ^ nil 
    ].

    dirstate readingFileDo:[:s|
        s binary.
        id := HGChangesetId fromBytes: (s next: 20).
    ].

    ^repository changesetWithId: id.

    "Created: / 13-11-2012 / 21:47:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 01-12-2012 / 15:12:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

heads
    "Return heads of currently checked-out branch"

    ^self branch heads

    "Created: / 27-11-2012 / 21:51:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

path
    "Return a path to the root directory of the receiver as *Filename*. 
     Use #root to get the root working copy file"

    ^repository path

    "Created: / 17-10-2012 / 13:53:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

pathName
    "Return a path to the root directory of the receiver as *String*
     Use #root to get the root working copy file"

    ^repository pathName

    "Created: / 05-12-2012 / 19:25:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

repository
    ^repository

    "Created: / 15-11-2012 / 09:48:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

root
    ^ root
! !

!HGWorkingCopy methodsFor:'actions'!

commit: message
    "Commits all uncommited changes with given message"

    ^self commit: message files: nil

    "Created: / 12-11-2012 / 22:35:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

commit:message files:files 
    "Commit given files with given message. If files
     is nil, all tracked modified files are commited"

    ^ self commit:message files:files author: nil"means - default"

    "Created: / 12-11-2012 / 22:36:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 17-11-2012 / 01:01:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 07-12-2012 / 11:44:14 / jv"
!

commit:message files:files author: authorOrNil
    "Commit given files with given message. If files
     is nil, all tracked modified files are commited"

    | author |

    authorOrNil isNil ifTrue:[
        author := HGAuthorQuery query.
        author isNil ifTrue:[
            author := repository config get: #(ui username) default: nil.
            author isNil ifTrue:[
                HGCommitError newException
                    parameter: { repository . message . files };
                    messageText: 'Commit author not specified!!';
                    raiseRequest
            ].
        ].
    ].

    ^ (HGCommand commit)
        workingDirectory:root pathName;
        message:message;
        files:files;
        author: author;
        execute

    "Created: / 07-12-2012 / 11:41:52 / jv"
    "Modified: / 07-12-2012 / 15:45:38 / jv"
!

update: revisionOrBranch

    ^HGCommand update
        workingDirectory: self path;
        revision: revisionOrBranch asString;
        execute

    "Created: / 21-11-2012 / 00:21:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGWorkingCopy methodsFor:'initialization'!

setRepository: aHGRepository
    super setRepository: aHGRepository.
    root :=HGWorkingCopyFile wc: self path: repository path.

    "Created: / 19-09-2012 / 09:43:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 19-10-2012 / 15:44:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGWorkingCopy methodsFor:'inspecting'!

browse
    "Opens a file browser on the working copy"

    root browse

    "Created: / 04-02-2012 / 17:14:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-11-2012 / 17:00:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGWorkingCopy methodsFor:'instance creation'!

/ aString
    ^root construct: aString

    "Created: / 24-09-2012 / 13:49:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

construct: aString

    ^root construct: aString

    "Created: / 24-09-2012 / 13:50:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGWorkingCopy class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
!

version_SVN
    ^ '§Id::                                                                                                                        §'
! !