mercurial/HGWorkingCopy.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 14 Jan 2013 22:16:57 +0000
changeset 178 1ed827252fee
parent 177 1b0ddad9770e
child 210 54a73fa50d40
permissions -rw-r--r--
More work on merging. Not yet finished.

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

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

Object subclass:#MergeState
	instanceVariableNames:'wc states'
	classVariableNames:''
	poolDictionaries:''
	privateIn:HGWorkingCopy
!


!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 createIfAbsent: true.

    "Created: / 27-11-2012 / 13:51:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 14-01-2013 / 14:23:30 / 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 on which the working copy is based on."

    | id dirstate |

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

    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: / 14-01-2013 / 13:37:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (comment): / 14-01-2013 / 16:17:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

conflicts
    "Return entries with conflicts (both resolved and unresolved)"

    ^self mergeState paths collect:[:p|root / p]

    "Created: / 14-01-2013 / 21:48:19 / 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:'accessing-private'!

mergeState
    mergeState isNil ifTrue:[
        mergeState := HGCachedFileData 
                        on: ((Filename named: root pathName) / '.hg' / 'merge' / 'state')
                        reader: [MergeState new setWorkingCopy: self]
    ].
    ^mergeState value

    "Created: / 14-01-2013 / 16:38:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!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"
!

merge: aChangesetOrChangesetId
    "Merge given changeset into workinf copy."

    ^HGCommand merge
        workingDirectory: self path;
        revision: aChangesetOrChangesetId asHGChangesetId asString;
        tool: 'internal:dump';
        execute

    "Created: / 14-01-2013 / 15:14:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

update
    "Update the working copy to the latest rev in current branch"

    ^self update: self branch name

    "Created: / 10-12-2012 / 11:25:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

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::MergeState methodsFor:'accessing'!

at: path
    ^self states at: path ifAbsent:[$C"like clean"].

    "Created: / 14-01-2013 / 16:47:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

includesKey: path
    ^self states includesKey: path

    "Created: / 14-01-2013 / 16:48:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

paths
    ^self states keys

    "Created: / 14-01-2013 / 21:46:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGWorkingCopy::MergeState methodsFor:'initialization'!

setWorkingCopy: anHGWorkingCopy
    wc := anHGWorkingCopy.

    "Created: / 14-01-2013 / 16:39:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGWorkingCopy::MergeState methodsFor:'private'!

states
    states isNil ifTrue:[
        states := HGCommand resolve__list
                    workingDirectory: wc pathName;
                    execute.
    ].
    ^states

    "Created: / 14-01-2013 / 16:47:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGWorkingCopy class methodsFor:'documentation'!

version_HG

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

version_SVN
    ^ '§Id::                                                                                                                        §'
! !