vcsgui-0.0.1: src/VCSGui/Svn/Commit.hs
-----------------------------------------------------------------------------
--
-- Module : Main
-- Copyright : 2011 Stephan Fortelny, Harald Jagenteufel
-- License : GPL
--
-- Maintainer : stephanfortelny at gmail.com, h.jagenteufel at gmail.com
-- Stability :
-- Portability :
--
-- | Provides a GUI to commit to a SVN working copy.
--
-----------------------------------------------------------------------------
module VCSGui.Svn.Commit (
showCommitGUI
) where
import qualified VCSGui.Common.Commit as C
import qualified VCSGui.Common.GtkHelper as H
import qualified VCSGui.Common.FilesInConflict as FiC
import qualified VCSGui.Common.MergeTool as M
import qualified VCSGui.Svn.Helper as SvnH
import VCSGui.Svn.AskPassword
import VCSGui.Common.ExceptionHandler
import qualified VCSWrapper.Svn as Svn
import Graphics.UI.Gtk
import Control.Monad.Trans(liftIO)
{- |
Shows a GUI showing status of subversion and possibilites to commit/cancel.
-}
showCommitGUI :: Either M.MergeTool M.MergeToolSetter -- ^ 'MergeTool' is used for any possible conflicts. If not present user will be asked to provide 'MergeTool' on conflicts. 'MergeToolSetter' will be called for response.
-> Either Handler (Maybe String) -- ^ Either 'Handler' for password request or password (nothing for no password)
-> Svn.Ctx()
showCommitGUI eMergeToolSetter eitherHandlerOrPw = do
conflictingFiles <- SvnH.getConflictingFiles
case conflictingFiles of
[] -> commonCommit
_ -> FiC.showFilesInConflictGUI
Nothing
(conflictingFiles)
(Svn.getFilesInConflict)
(\fileToResolve -> Svn.resolved [fileToResolve] Nothing [])
eMergeToolSetter
$ commonCommit
where
commonCommit = C.showCommitGUI setUpTreeView (okCallback eitherHandlerOrPw)
okCallback :: Either Handler (Maybe String) -- ^ either callback for password request or password (nothing for no password)
-> String -- ^ commit message
-> [FilePath] -- ^ selected files
-> [C.Option] -- ^ TODO options
-> Svn.Ctx ()
okCallback eitherHandlerOrPw msg filesToCommit _ = do
case eitherHandlerOrPw of
Left handler -> do
showAskpassGUI (ownHandler handler)
return ()
Right pw -> doCommit msg filesToCommit pw
where
doCommit msg filesToCommit mbPw = do
Svn.add filesToCommit mbPw []
Svn.commit filesToCommit msg mbPw []
return()
ownHandler :: Handler
-> Handler
ownHandler handler = \result -> do
case result of
Nothing -> handler result
Just (_,mbPw) -> do
doCommit msg filesToCommit mbPw
handler result
setUpTreeView :: TreeView -> Svn.Ctx (ListStore C.SCFile)
setUpTreeView listView = do
-- get status
repoStatus <- Svn.status
--check files for conflicts
liftIO $ do
-- create model
listStore <- listStoreNew [
(C.SVNSCFile (ctxSelect (Svn.modification status))
(Svn.filePath status)
(show (Svn.modification status))
(Svn.isLocked status))
| status <- repoStatus]
treeViewSetModel listView listStore
let treeViewItem = (listStore, listView)
renderer <- cellRendererToggleNew
H.addColumnToTreeView' treeViewItem
renderer
""
$ \scf -> [cellToggleActive := C.selected scf]
-- connect select action
on renderer cellToggled $ \columnId -> do
Just treeIter <- treeModelGetIterFromString listStore columnId
value <- listStoreGetValue listStore $ listStoreIterToIndex treeIter
let newValue = (\(C.SVNSCFile bool fp s l) -> C.SVNSCFile (not bool) fp s l)
value
listStoreSetValue listStore (listStoreIterToIndex treeIter) newValue
return ()
renderer <- cellRendererTextNew
H.addColumnToTreeView' treeViewItem
renderer
"Files to commit"
$ \scf -> [cellText := C.filePath scf]
renderer <- cellRendererTextNew
H.addColumnToTreeView' treeViewItem
renderer
"Status"
$ \scf -> [cellText := C.status scf]
renderer <- cellRendererToggleNew
H.addColumnToTreeView' treeViewItem
renderer
"Locked"
$ \scf -> [cellToggleActive := C.isLocked scf]
return listStore
where
ctxSelect status = status == Svn.Added || status == Svn.Deleted || status==Svn.Modified ||
status == Svn.Replaced