{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc)

Represents a git submodule.
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.Ggit.Structs.Submodule
    (

-- * Exported types
    Submodule(..)                           ,
    noSubmodule                             ,


 -- * Methods
-- ** getFetchRecurse #method:getFetchRecurse#

#if ENABLE_OVERLOADING
    SubmoduleGetFetchRecurseMethodInfo      ,
#endif
    submoduleGetFetchRecurse                ,


-- ** getHeadId #method:getHeadId#

#if ENABLE_OVERLOADING
    SubmoduleGetHeadIdMethodInfo            ,
#endif
    submoduleGetHeadId                      ,


-- ** getIgnore #method:getIgnore#

#if ENABLE_OVERLOADING
    SubmoduleGetIgnoreMethodInfo            ,
#endif
    submoduleGetIgnore                      ,


-- ** getIndexId #method:getIndexId#

#if ENABLE_OVERLOADING
    SubmoduleGetIndexIdMethodInfo           ,
#endif
    submoduleGetIndexId                     ,


-- ** getName #method:getName#

#if ENABLE_OVERLOADING
    SubmoduleGetNameMethodInfo              ,
#endif
    submoduleGetName                        ,


-- ** getOwner #method:getOwner#

#if ENABLE_OVERLOADING
    SubmoduleGetOwnerMethodInfo             ,
#endif
    submoduleGetOwner                       ,


-- ** getPath #method:getPath#

#if ENABLE_OVERLOADING
    SubmoduleGetPathMethodInfo              ,
#endif
    submoduleGetPath                        ,


-- ** getUpdate #method:getUpdate#

#if ENABLE_OVERLOADING
    SubmoduleGetUpdateMethodInfo            ,
#endif
    submoduleGetUpdate                      ,


-- ** getUrl #method:getUrl#

#if ENABLE_OVERLOADING
    SubmoduleGetUrlMethodInfo               ,
#endif
    submoduleGetUrl                         ,


-- ** getWorkdirId #method:getWorkdirId#

#if ENABLE_OVERLOADING
    SubmoduleGetWorkdirIdMethodInfo         ,
#endif
    submoduleGetWorkdirId                   ,


-- ** init #method:init#

#if ENABLE_OVERLOADING
    SubmoduleInitMethodInfo                 ,
#endif
    submoduleInit                           ,


-- ** open #method:open#

#if ENABLE_OVERLOADING
    SubmoduleOpenMethodInfo                 ,
#endif
    submoduleOpen                           ,


-- ** ref #method:ref#

#if ENABLE_OVERLOADING
    SubmoduleRefMethodInfo                  ,
#endif
    submoduleRef                            ,


-- ** reload #method:reload#

#if ENABLE_OVERLOADING
    SubmoduleReloadMethodInfo               ,
#endif
    submoduleReload                         ,


-- ** sync #method:sync#

#if ENABLE_OVERLOADING
    SubmoduleSyncMethodInfo                 ,
#endif
    submoduleSync                           ,


-- ** unref #method:unref#

#if ENABLE_OVERLOADING
    SubmoduleUnrefMethodInfo                ,
#endif
    submoduleUnref                          ,


-- ** update #method:update#

#if ENABLE_OVERLOADING
    SubmoduleUpdateMethodInfo               ,
#endif
    submoduleUpdate                         ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP
import qualified GHC.OverloadedLabels as OL

import {-# SOURCE #-} qualified GI.Ggit.Enums as Ggit.Enums
import {-# SOURCE #-} qualified GI.Ggit.Objects.Repository as Ggit.Repository
import {-# SOURCE #-} qualified GI.Ggit.Objects.SubmoduleUpdateOptions as Ggit.SubmoduleUpdateOptions
import {-# SOURCE #-} qualified GI.Ggit.Structs.OId as Ggit.OId

-- | Memory-managed wrapper type.
newtype Submodule = Submodule (ManagedPtr Submodule)
foreign import ccall "ggit_submodule_get_type" c_ggit_submodule_get_type ::
    IO GType

instance BoxedObject Submodule where
    boxedType _ = c_ggit_submodule_get_type

-- | A convenience alias for `Nothing` :: `Maybe` `Submodule`.
noSubmodule :: Maybe Submodule
noSubmodule = Nothing


#if ENABLE_OVERLOADING
instance O.HasAttributeList Submodule
type instance O.AttributeList Submodule = SubmoduleAttributeList
type SubmoduleAttributeList = ('[ ] :: [(Symbol, *)])
#endif

-- method Submodule::get_fetch_recurse
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_fetch_recurse" ggit_submodule_get_fetch_recurse ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO CInt

{- |
Gets whether to fetch recursively. See see gitmodules(5) fetchRecurseSubmodules.
-}
submoduleGetFetchRecurse ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m Bool
    {- ^ __Returns:__ whether or not fetch recursively. -}
submoduleGetFetchRecurse submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_fetch_recurse submodule'
    let result' = (/= 0) result
    touchManagedPtr submodule
    return result'

#if ENABLE_OVERLOADING
data SubmoduleGetFetchRecurseMethodInfo
instance (signature ~ (m Bool), MonadIO m) => O.MethodInfo SubmoduleGetFetchRecurseMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetFetchRecurse

#endif

-- method Submodule::get_head_id
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Nothing, sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "OId"}))
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_head_id" ggit_submodule_get_head_id ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO (Ptr Ggit.OId.OId)

{- |
/No description available in the introspection data./
-}
submoduleGetHeadId ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    -> m Ggit.OId.OId
submoduleGetHeadId submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_head_id submodule'
    checkUnexpectedReturnNULL "submoduleGetHeadId" result
    result' <- (wrapBoxed Ggit.OId.OId) result
    touchManagedPtr submodule
    return result'

#if ENABLE_OVERLOADING
data SubmoduleGetHeadIdMethodInfo
instance (signature ~ (m Ggit.OId.OId), MonadIO m) => O.MethodInfo SubmoduleGetHeadIdMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetHeadId

#endif

-- method Submodule::get_ignore
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "SubmoduleIgnore"}))
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_ignore" ggit_submodule_get_ignore ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO CInt

{- |
Gets a 'GI.Ggit.Enums.SubmoduleIgnore'. See see gitmodules(5) ignore.
-}
submoduleGetIgnore ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m Ggit.Enums.SubmoduleIgnore
    {- ^ __Returns:__ the 'GI.Ggit.Enums.SubmoduleIgnore'. -}
submoduleGetIgnore submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_ignore submodule'
    let result' = (toEnum . fromIntegral) result
    touchManagedPtr submodule
    return result'

#if ENABLE_OVERLOADING
data SubmoduleGetIgnoreMethodInfo
instance (signature ~ (m Ggit.Enums.SubmoduleIgnore), MonadIO m) => O.MethodInfo SubmoduleGetIgnoreMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetIgnore

#endif

-- method Submodule::get_index_id
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "OId"}))
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_index_id" ggit_submodule_get_index_id ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO (Ptr Ggit.OId.OId)

{- |
Gets the OID for the submodule in the index or 'Nothing' if there is no index.
-}
submoduleGetIndexId ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m (Maybe Ggit.OId.OId)
    {- ^ __Returns:__ the OID for the submodule in the index or 'Nothing'. -}
submoduleGetIndexId submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_index_id submodule'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (wrapBoxed Ggit.OId.OId) result'
        return result''
    touchManagedPtr submodule
    return maybeResult

#if ENABLE_OVERLOADING
data SubmoduleGetIndexIdMethodInfo
instance (signature ~ (m (Maybe Ggit.OId.OId)), MonadIO m) => O.MethodInfo SubmoduleGetIndexIdMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetIndexId

#endif

-- method Submodule::get_name
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_name" ggit_submodule_get_name ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO CString

{- |
Gets the name of the submodule from .gitmodules.
-}
submoduleGetName ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m (Maybe T.Text)
    {- ^ __Returns:__ the name of the submodule from .gitmodules or 'Nothing'. -}
submoduleGetName submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_name submodule'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- cstringToText result'
        return result''
    touchManagedPtr submodule
    return maybeResult

#if ENABLE_OVERLOADING
data SubmoduleGetNameMethodInfo
instance (signature ~ (m (Maybe T.Text)), MonadIO m) => O.MethodInfo SubmoduleGetNameMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetName

#endif

-- method Submodule::get_owner
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "Repository"}))
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_owner" ggit_submodule_get_owner ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO (Ptr Ggit.Repository.Repository)

{- |
Gets the containing repository for a submodule.
-}
submoduleGetOwner ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m (Maybe Ggit.Repository.Repository)
    {- ^ __Returns:__ the containing repository for a submodule or 'Nothing'. -}
submoduleGetOwner submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_owner submodule'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (wrapObject Ggit.Repository.Repository) result'
        return result''
    touchManagedPtr submodule
    return maybeResult

#if ENABLE_OVERLOADING
data SubmoduleGetOwnerMethodInfo
instance (signature ~ (m (Maybe Ggit.Repository.Repository)), MonadIO m) => O.MethodInfo SubmoduleGetOwnerMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetOwner

#endif

-- method Submodule::get_path
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_path" ggit_submodule_get_path ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO CString

{- |
Gets the path to the submodule from the repo working directory.
It is almost always the same as the name.
See 'GI.Ggit.Structs.Submodule.submoduleGetName'.
-}
submoduleGetPath ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m (Maybe T.Text)
    {- ^ __Returns:__ the path to the submodule from
the repo working directory or 'Nothing'. -}
submoduleGetPath submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_path submodule'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- cstringToText result'
        return result''
    touchManagedPtr submodule
    return maybeResult

#if ENABLE_OVERLOADING
data SubmoduleGetPathMethodInfo
instance (signature ~ (m (Maybe T.Text)), MonadIO m) => O.MethodInfo SubmoduleGetPathMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetPath

#endif

-- method Submodule::get_update
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "SubmoduleUpdate"}))
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_update" ggit_submodule_get_update ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO CUInt

{- |
Gets a 'GI.Ggit.Enums.SubmoduleUpdate'. See see gitmodules(5) update.
-}
submoduleGetUpdate ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m Ggit.Enums.SubmoduleUpdate
    {- ^ __Returns:__ the 'GI.Ggit.Enums.SubmoduleUpdate'. -}
submoduleGetUpdate submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_update submodule'
    let result' = (toEnum . fromIntegral) result
    touchManagedPtr submodule
    return result'

#if ENABLE_OVERLOADING
data SubmoduleGetUpdateMethodInfo
instance (signature ~ (m Ggit.Enums.SubmoduleUpdate), MonadIO m) => O.MethodInfo SubmoduleGetUpdateMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetUpdate

#endif

-- method Submodule::get_url
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_url" ggit_submodule_get_url ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO CString

{- |
Gets the url for the submodule or 'Nothing' if the submodule has been deleted
but not yet committed.
-}
submoduleGetUrl ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m (Maybe T.Text)
    {- ^ __Returns:__ the url for the submodule or 'Nothing'. -}
submoduleGetUrl submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_url submodule'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- cstringToText result'
        return result''
    touchManagedPtr submodule
    return maybeResult

#if ENABLE_OVERLOADING
data SubmoduleGetUrlMethodInfo
instance (signature ~ (m (Maybe T.Text)), MonadIO m) => O.MethodInfo SubmoduleGetUrlMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetUrl

#endif

-- method Submodule::get_workdir_id
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "OId"}))
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_get_workdir_id" ggit_submodule_get_workdir_id ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO (Ptr Ggit.OId.OId)

{- |
Gets the OID for the submodule in the current working directory.
Corresponds to looking up \'HEAD\' in the checked out submodule.
If there are pending changes in the index or anything
else, this won\'t notice that.  You should call @/ggit_submodule_status()/@
for a more complete picture about the state of the working directory.
-}
submoduleGetWorkdirId ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m (Maybe Ggit.OId.OId)
    {- ^ __Returns:__ the OID for the submodule in the current working directory or 'Nothing'. -}
submoduleGetWorkdirId submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_get_workdir_id submodule'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (wrapBoxed Ggit.OId.OId) result'
        return result''
    touchManagedPtr submodule
    return maybeResult

#if ENABLE_OVERLOADING
data SubmoduleGetWorkdirIdMethodInfo
instance (signature ~ (m (Maybe Ggit.OId.OId)), MonadIO m) => O.MethodInfo SubmoduleGetWorkdirIdMethodInfo Submodule signature where
    overloadedMethod _ = submoduleGetWorkdirId

#endif

-- method Submodule::init
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "overwrite", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "forces existing entries to be updated.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : True
-- Skip return : False

foreign import ccall "ggit_submodule_init" ggit_submodule_init ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    CInt ->                                 -- overwrite : TBasicType TBoolean
    Ptr (Ptr GError) ->                     -- error
    IO ()

{- |
Just like \"git submodule init\", this copies information about the
submodule into \".git\/config\".  You can use the accessor functions
above to alter the in-memory git_submodule object and control what
is written to the config, overriding what is in .gitmodules.
-}
submoduleInit ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> Bool
    {- ^ /@overwrite@/: forces existing entries to be updated. -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
submoduleInit submodule overwrite = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    let overwrite' = (fromIntegral . fromEnum) overwrite
    onException (do
        propagateGError $ ggit_submodule_init submodule' overwrite'
        touchManagedPtr submodule
        return ()
     ) (do
        return ()
     )

#if ENABLE_OVERLOADING
data SubmoduleInitMethodInfo
instance (signature ~ (Bool -> m ()), MonadIO m) => O.MethodInfo SubmoduleInitMethodInfo Submodule signature where
    overloadedMethod _ = submoduleInit

#endif

-- method Submodule::open
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "Repository"}))
-- throws : True
-- Skip return : False

foreign import ccall "ggit_submodule_open" ggit_submodule_open ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr Ggit.Repository.Repository)

{- |
Open the repository for a submodule. Multiple calls to this function
will return distinct 'GI.Ggit.Objects.Repository.Repository' objects. Only submodules which are
checked out in the working directory can be opened.
-}
submoduleOpen ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m (Maybe Ggit.Repository.Repository)
    {- ^ __Returns:__ the opened 'GI.Ggit.Objects.Repository.Repository' or 'Nothing' in case of an
                          error. /(Can throw 'Data.GI.Base.GError.GError')/ -}
submoduleOpen submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    onException (do
        result <- propagateGError $ ggit_submodule_open submodule'
        maybeResult <- convertIfNonNull result $ \result' -> do
            result'' <- (wrapObject Ggit.Repository.Repository) result'
            return result''
        touchManagedPtr submodule
        return maybeResult
     ) (do
        return ()
     )

#if ENABLE_OVERLOADING
data SubmoduleOpenMethodInfo
instance (signature ~ (m (Maybe Ggit.Repository.Repository)), MonadIO m) => O.MethodInfo SubmoduleOpenMethodInfo Submodule signature where
    overloadedMethod _ = submoduleOpen

#endif

-- method Submodule::ref
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "Submodule"}))
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_ref" ggit_submodule_ref ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO (Ptr Submodule)

{- |
Atomically increments the reference count of /@submodule@/ by one.
This function is MT-safe and may be called from any thread.
-}
submoduleRef ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m (Maybe Submodule)
    {- ^ __Returns:__ the passed in 'GI.Ggit.Structs.Submodule.Submodule' or 'Nothing'. -}
submoduleRef submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    result <- ggit_submodule_ref submodule'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (newBoxed Submodule) result'
        return result''
    touchManagedPtr submodule
    return maybeResult

#if ENABLE_OVERLOADING
data SubmoduleRefMethodInfo
instance (signature ~ (m (Maybe Submodule)), MonadIO m) => O.MethodInfo SubmoduleRefMethodInfo Submodule signature where
    overloadedMethod _ = submoduleRef

#endif

-- method Submodule::reload
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "force", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "reload even if the data doesn't seem out of date.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : True
-- Skip return : False

foreign import ccall "ggit_submodule_reload" ggit_submodule_reload ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    CInt ->                                 -- force : TBasicType TBoolean
    Ptr (Ptr GError) ->                     -- error
    IO ()

{- |
Rereads submodule info from config, index, and HEAD.
Call this if you have reason to believe that it has changed.
-}
submoduleReload ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> Bool
    {- ^ /@force@/: reload even if the data doesn\'t seem out of date. -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
submoduleReload submodule force = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    let force' = (fromIntegral . fromEnum) force
    onException (do
        propagateGError $ ggit_submodule_reload submodule' force'
        touchManagedPtr submodule
        return ()
     ) (do
        return ()
     )

#if ENABLE_OVERLOADING
data SubmoduleReloadMethodInfo
instance (signature ~ (Bool -> m ()), MonadIO m) => O.MethodInfo SubmoduleReloadMethodInfo Submodule signature where
    overloadedMethod _ = submoduleReload

#endif

-- method Submodule::sync
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : True
-- Skip return : False

foreign import ccall "ggit_submodule_sync" ggit_submodule_sync ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    Ptr (Ptr GError) ->                     -- error
    IO ()

{- |
Copies the information about the submodules URL into the checked out
submodule config, acting like \"git submodule sync\".  This is useful if
you have altered the URL for the submodule (or it has been altered by a
fetch of upstream changes) and you need to update your local repo.
-}
submoduleSync ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
submoduleSync submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    onException (do
        propagateGError $ ggit_submodule_sync submodule'
        touchManagedPtr submodule
        return ()
     ) (do
        return ()
     )

#if ENABLE_OVERLOADING
data SubmoduleSyncMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo SubmoduleSyncMethodInfo Submodule signature where
    overloadedMethod _ = submoduleSync

#endif

-- method Submodule::unref
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "ggit_submodule_unref" ggit_submodule_unref ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    IO ()

{- |
Atomically decrements the reference count of /@submodule@/ by one.
If the reference count drops to 0, /@remote@/ is freed.
-}
submoduleUnref ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> m ()
submoduleUnref submodule = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    ggit_submodule_unref submodule'
    touchManagedPtr submodule
    return ()

#if ENABLE_OVERLOADING
data SubmoduleUnrefMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo SubmoduleUnrefMethodInfo Submodule signature where
    overloadedMethod _ = submoduleUnref

#endif

-- method Submodule::update
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "submodule", argType = TInterface (Name {namespace = "Ggit", name = "Submodule"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmodule.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "init", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "If the submodule is not initialized, setting this flag to true\n       will initialize the submodule before updating. Otherwise, this\n       will return an error if attempting to update an uninitialzed\n       repository. but setting this to true forces them to be updated.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "options", argType = TInterface (Name {namespace = "Ggit", name = "SubmoduleUpdateOptions"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitSubmoduleUpdateOptions object.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : True
-- Skip return : False

foreign import ccall "ggit_submodule_update" ggit_submodule_update ::
    Ptr Submodule ->                        -- submodule : TInterface (Name {namespace = "Ggit", name = "Submodule"})
    CInt ->                                 -- init : TBasicType TBoolean
    Ptr Ggit.SubmoduleUpdateOptions.SubmoduleUpdateOptions -> -- options : TInterface (Name {namespace = "Ggit", name = "SubmoduleUpdateOptions"})
    Ptr (Ptr GError) ->                     -- error
    IO ()

{- |
Update a submodule. This will clone a missing submodule and checkout
the subrepository to the commit specified in the index of the containing
repository. If the submodule repository doesn\'t contain the target commit
(e.g. because fetchRecurseSubmodules isn\'t set), then the submodule is
fetched using the fetch options supplied in options.
-}
submoduleUpdate ::
    (B.CallStack.HasCallStack, MonadIO m, Ggit.SubmoduleUpdateOptions.IsSubmoduleUpdateOptions a) =>
    Submodule
    {- ^ /@submodule@/: a 'GI.Ggit.Structs.Submodule.Submodule'. -}
    -> Bool
    {- ^ /@init@/: If the submodule is not initialized, setting this flag to true
       will initialize the submodule before updating. Otherwise, this
       will return an error if attempting to update an uninitialzed
       repository. but setting this to true forces them to be updated. -}
    -> a
    {- ^ /@options@/: a 'GI.Ggit.Objects.SubmoduleUpdateOptions.SubmoduleUpdateOptions' object. -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
submoduleUpdate submodule init options = liftIO $ do
    submodule' <- unsafeManagedPtrGetPtr submodule
    let init' = (fromIntegral . fromEnum) init
    options' <- unsafeManagedPtrCastPtr options
    onException (do
        propagateGError $ ggit_submodule_update submodule' init' options'
        touchManagedPtr submodule
        touchManagedPtr options
        return ()
     ) (do
        return ()
     )

#if ENABLE_OVERLOADING
data SubmoduleUpdateMethodInfo
instance (signature ~ (Bool -> a -> m ()), MonadIO m, Ggit.SubmoduleUpdateOptions.IsSubmoduleUpdateOptions a) => O.MethodInfo SubmoduleUpdateMethodInfo Submodule signature where
    overloadedMethod _ = submoduleUpdate

#endif

#if ENABLE_OVERLOADING
type family ResolveSubmoduleMethod (t :: Symbol) (o :: *) :: * where
    ResolveSubmoduleMethod "init" o = SubmoduleInitMethodInfo
    ResolveSubmoduleMethod "open" o = SubmoduleOpenMethodInfo
    ResolveSubmoduleMethod "ref" o = SubmoduleRefMethodInfo
    ResolveSubmoduleMethod "reload" o = SubmoduleReloadMethodInfo
    ResolveSubmoduleMethod "sync" o = SubmoduleSyncMethodInfo
    ResolveSubmoduleMethod "unref" o = SubmoduleUnrefMethodInfo
    ResolveSubmoduleMethod "update" o = SubmoduleUpdateMethodInfo
    ResolveSubmoduleMethod "getFetchRecurse" o = SubmoduleGetFetchRecurseMethodInfo
    ResolveSubmoduleMethod "getHeadId" o = SubmoduleGetHeadIdMethodInfo
    ResolveSubmoduleMethod "getIgnore" o = SubmoduleGetIgnoreMethodInfo
    ResolveSubmoduleMethod "getIndexId" o = SubmoduleGetIndexIdMethodInfo
    ResolveSubmoduleMethod "getName" o = SubmoduleGetNameMethodInfo
    ResolveSubmoduleMethod "getOwner" o = SubmoduleGetOwnerMethodInfo
    ResolveSubmoduleMethod "getPath" o = SubmoduleGetPathMethodInfo
    ResolveSubmoduleMethod "getUpdate" o = SubmoduleGetUpdateMethodInfo
    ResolveSubmoduleMethod "getUrl" o = SubmoduleGetUrlMethodInfo
    ResolveSubmoduleMethod "getWorkdirId" o = SubmoduleGetWorkdirIdMethodInfo
    ResolveSubmoduleMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveSubmoduleMethod t Submodule, O.MethodInfo info Submodule p) => OL.IsLabel t (Submodule -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

#endif