mercurial/HGMergeTool.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 01 Feb 2013 12:02:22 +0000
changeset 210 54a73fa50d40
parent 182 e58f54764529
child 235 3d8ef499d7d9
permissions -rw-r--r--
Added copyright notice.

"
 COPYRIGHT (c) 2012-2013 by Jan Vrany
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
"{ Package: 'stx:libscm/mercurial' }"

Object subclass:#HGMergeTool
	instanceVariableNames:'file'
	classVariableNames:''
	poolDictionaries:''
	category:'SCM-Mercurial-StX'
!

HGMergeTool subclass:#Mercurial
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	privateIn:HGMergeTool
!

HGMergeTool subclass:#Smalltalk
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	privateIn:HGMergeTool
!

!HGMergeTool class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 2012-2013 by Jan Vrany
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
!

documentation
"
    A base abstract class for merge tools.

    [author:]
        Jan Vrany <jan.vrany@fit.cvut.cz>

    [instance variables:]

    [class variables:]

    [see also:]

"
! !

!HGMergeTool class methodsFor:'instance creation'!

for: anHGWorkingCopyFile
    "
    Return a merge tool suitable for given working copy file
    "
    ^anHGWorkingCopyFile suffix = 'st' ifTrue:[
        Smalltalk new setFile: anHGWorkingCopyFile 
    ] ifFalse:[
        Mercurial new setFile: anHGWorkingCopyFile
    ]

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

!HGMergeTool methodsFor:'accessing'!

fileBase
    "Return path to a file representing base revision"

    ^(file pathName , '.base') asFilename

    "Created: / 14-01-2013 / 21:12:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-01-2013 / 10:08:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileLocal
    "Return path to a file representing current revision (the
     one of current wc revision"

    ^(file pathName , '.local') asFilename

    "Created: / 14-01-2013 / 21:13:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-01-2013 / 10:08:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileOther
    "Return path to a file representing the revision to merge in"

    ^(file pathName , '.other') asFilename

    "Created: / 14-01-2013 / 21:13:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-01-2013 / 10:08:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileOutput
    "Return file where to save the merged version"

    ^file

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

!HGMergeTool methodsFor:'initialization'!

setFile: anHGWorkingCopyFile
    self assert: (anHGWorkingCopyFile isKindOf: HGWorkingCopyFile).
    file := anHGWorkingCopyFile

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

!HGMergeTool methodsFor:'merging'!

merge
    "Runs a merge on file. Return true, if file conflicts had been
     resolved, false otherwise"

    self subclassResponsibility

    "Created: / 14-01-2013 / 18:16:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 14-01-2013 / 20:00:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

premerge                
    "Tries to merge files automatically. Returns true, if succeeded, false otherwise.
     In that case, it is necessary to call #merge which may require user interaction. 

     Note that calling #merge is always safe.
     "

    ^false

    "Created: / 14-01-2013 / 20:04:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (comment): / 14-01-2013 / 21:09:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGMergeTool::Mercurial class methodsFor:'documentation'!

documentation
"
    A merge tool using mercurials built-in merge tool resulution.
    Basically, it calls

        hg resolve <file>

    [author:]
        Jan Vrany <jan.vrany@fit.cvut.cz>

    [instance variables:]

    [class variables:]

    [see also:]
        hg help resolve 

"
! !

!HGMergeTool::Mercurial methodsFor:'merging'!

merge
    "Runs a merge on file. Return true, if file conflicts had been
     resolved, false otherwise"

    ^HGCommand resolve
        workingDirectory: file directory pathName;
        files: (Array with: file baseName);
        execute

    "Modified: / 14-01-2013 / 20:57:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!HGMergeTool::Smalltalk class methodsFor:'documentation'!

documentation
"
    A merge tool for Smalltalk class .st files. It compares and merges
    changesets.

    [author:]
        Jan Vrany <jan.vrany@fit.cvut.cz>

    [instance variables:]

    [class variables:]

    [see also:]
        ChangeSetDiff
        Tools::ChangeSetDiffTool

"
! !

!HGMergeTool::Smalltalk methodsFor:'merging'!

merge
    "Runs a merge on file. Return true, if file conflicts had been
     resolved, false otherwise"

    | tool |

    tool := Tools::ChangeSetDiffTool new.
    tool
        fileMenuOpenOnDiffInfo: self changesetDiffInfo;
        openModal.
    ^tool mergeSavedHolder value

    .

    "Modified: / 17-01-2013 / 21:11:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

premerge                
    "Tries to merge files automatically. Returns true, if succeeded, false otherwise.
     In that case, it is necessary to call #merge which may require user interaction. 

     Note that calling #merge is always safe.
     "

    | dinfo merged |

    HGCommand resolve
        workingDirectory: file directory pathName;
        tool: 'internal:dump';
        files: (Array with: file baseName);
        execute.

    dinfo := self changesetDiffInfo.
    dinfo read.

    ^dinfo diffset isMerged ifTrue:[
        merged := dinfo diffset changesetMerged , dinfo same. 
        merged := merged reject:[:chg|chg isDoIt].
        merged saveToFile: self fileOutput format: #classSource.
        true.
    ] ifFalse:[
        false
    ]

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

!HGMergeTool::Smalltalk methodsFor:'private'!

changesetDiffInfo
    ^Tools::ChangeSetDiffInfo
        specA: (Tools::ChangeSetSpec file: self fileLocal pathName)
        specB: (Tools::ChangeSetSpec file: self fileOther pathName)
        specBase: (Tools::ChangeSetSpec file: self fileBase pathName)
        specMerge: (Tools::ChangeSetSpec file: self fileOutput pathName).

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

!HGMergeTool class methodsFor:'documentation'!

version_HG

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