{- |
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 remote.
-}

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

module GI.Ggit.Objects.Remote
    (

-- * Exported types
    Remote(..)                              ,
    IsRemote                                ,
    toRemote                                ,
    noRemote                                ,


 -- * Methods
-- ** connect #method:connect#

#if ENABLE_OVERLOADING
    RemoteConnectMethodInfo                 ,
#endif
    remoteConnect                           ,


-- ** disconnect #method:disconnect#

#if ENABLE_OVERLOADING
    RemoteDisconnectMethodInfo              ,
#endif
    remoteDisconnect                        ,


-- ** download #method:download#

#if ENABLE_OVERLOADING
    RemoteDownloadMethodInfo                ,
#endif
    remoteDownload                          ,


-- ** getConnected #method:getConnected#

#if ENABLE_OVERLOADING
    RemoteGetConnectedMethodInfo            ,
#endif
    remoteGetConnected                      ,


-- ** getFetchSpecs #method:getFetchSpecs#

#if ENABLE_OVERLOADING
    RemoteGetFetchSpecsMethodInfo           ,
#endif
    remoteGetFetchSpecs                     ,


-- ** getName #method:getName#

#if ENABLE_OVERLOADING
    RemoteGetNameMethodInfo                 ,
#endif
    remoteGetName                           ,


-- ** getOwner #method:getOwner#

#if ENABLE_OVERLOADING
    RemoteGetOwnerMethodInfo                ,
#endif
    remoteGetOwner                          ,


-- ** getPushSpecs #method:getPushSpecs#

#if ENABLE_OVERLOADING
    RemoteGetPushSpecsMethodInfo            ,
#endif
    remoteGetPushSpecs                      ,


-- ** getUrl #method:getUrl#

#if ENABLE_OVERLOADING
    RemoteGetUrlMethodInfo                  ,
#endif
    remoteGetUrl                            ,


-- ** list #method:list#

#if ENABLE_OVERLOADING
    RemoteListMethodInfo                    ,
#endif
    remoteList                              ,


-- ** new #method:new#

    remoteNew                               ,


-- ** newAnonymous #method:newAnonymous#

    remoteNewAnonymous                      ,


-- ** push #method:push#

#if ENABLE_OVERLOADING
    RemotePushMethodInfo                    ,
#endif
    remotePush                              ,


-- ** updateTips #method:updateTips#

#if ENABLE_OVERLOADING
    RemoteUpdateTipsMethodInfo              ,
#endif
    remoteUpdateTips                        ,


-- ** upload #method:upload#

#if ENABLE_OVERLOADING
    RemoteUploadMethodInfo                  ,
#endif
    remoteUpload                            ,




    ) 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 qualified GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.Ggit.Enums as Ggit.Enums
import {-# SOURCE #-} qualified GI.Ggit.Objects.Native as Ggit.Native
import {-# SOURCE #-} qualified GI.Ggit.Objects.ObjectFactoryBase as Ggit.ObjectFactoryBase
import {-# SOURCE #-} qualified GI.Ggit.Objects.ProxyOptions as Ggit.ProxyOptions
import {-# SOURCE #-} qualified GI.Ggit.Objects.PushOptions as Ggit.PushOptions
import {-# SOURCE #-} qualified GI.Ggit.Objects.RemoteCallbacks as Ggit.RemoteCallbacks
import {-# SOURCE #-} qualified GI.Ggit.Objects.Repository as Ggit.Repository
import {-# SOURCE #-} qualified GI.Ggit.Structs.FetchOptions as Ggit.FetchOptions
import {-# SOURCE #-} qualified GI.Ggit.Structs.RemoteHead as Ggit.RemoteHead

-- | Memory-managed wrapper type.
newtype Remote = Remote (ManagedPtr Remote)
foreign import ccall "ggit_remote_get_type"
    c_ggit_remote_get_type :: IO GType

instance GObject Remote where
    gobjectType = c_ggit_remote_get_type


-- | Type class for types which can be safely cast to `Remote`, for instance with `toRemote`.
class (GObject o, O.IsDescendantOf Remote o) => IsRemote o
instance (GObject o, O.IsDescendantOf Remote o) => IsRemote o

instance O.HasParentTypes Remote
type instance O.ParentTypes Remote = '[Ggit.Native.Native, Ggit.ObjectFactoryBase.ObjectFactoryBase, GObject.Object.Object]

-- | Cast to `Remote`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toRemote :: (MonadIO m, IsRemote o) => o -> m Remote
toRemote = liftIO . unsafeCastTo Remote

-- | A convenience alias for `Nothing` :: `Maybe` `Remote`.
noRemote :: Maybe Remote
noRemote = Nothing

#if ENABLE_OVERLOADING
type family ResolveRemoteMethod (t :: Symbol) (o :: *) :: * where
    ResolveRemoteMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveRemoteMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveRemoteMethod "connect" o = RemoteConnectMethodInfo
    ResolveRemoteMethod "disconnect" o = RemoteDisconnectMethodInfo
    ResolveRemoteMethod "download" o = RemoteDownloadMethodInfo
    ResolveRemoteMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveRemoteMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveRemoteMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveRemoteMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveRemoteMethod "list" o = RemoteListMethodInfo
    ResolveRemoteMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveRemoteMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveRemoteMethod "push" o = RemotePushMethodInfo
    ResolveRemoteMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveRemoteMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveRemoteMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveRemoteMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveRemoteMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveRemoteMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveRemoteMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveRemoteMethod "updateTips" o = RemoteUpdateTipsMethodInfo
    ResolveRemoteMethod "upload" o = RemoteUploadMethodInfo
    ResolveRemoteMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveRemoteMethod "getConnected" o = RemoteGetConnectedMethodInfo
    ResolveRemoteMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveRemoteMethod "getFetchSpecs" o = RemoteGetFetchSpecsMethodInfo
    ResolveRemoteMethod "getName" o = RemoteGetNameMethodInfo
    ResolveRemoteMethod "getOwner" o = RemoteGetOwnerMethodInfo
    ResolveRemoteMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveRemoteMethod "getPushSpecs" o = RemoteGetPushSpecsMethodInfo
    ResolveRemoteMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveRemoteMethod "getUrl" o = RemoteGetUrlMethodInfo
    ResolveRemoteMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveRemoteMethod "setDataFull" o = GObject.Object.ObjectSetDataFullMethodInfo
    ResolveRemoteMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveRemoteMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveRemoteMethod t Remote, O.MethodInfo info Remote p) => OL.IsLabel t (Remote -> 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

#if ENABLE_OVERLOADING
instance O.HasAttributeList Remote
type instance O.AttributeList Remote = RemoteAttributeList
type RemoteAttributeList = ('[ '("native", Ggit.Native.NativeNativePropertyInfo)] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
type instance O.SignalList Remote = RemoteSignalList
type RemoteSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

#endif

-- method Remote::new
-- method type : Constructor
-- Args : [Arg {argCName = "repository", argType = TInterface (Name {namespace = "Ggit", name = "Repository"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRepository.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the remote's name.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "url", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the remote repository's URL.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "Remote"}))
-- throws : True
-- Skip return : False

foreign import ccall "ggit_remote_new" ggit_remote_new ::
    Ptr Ggit.Repository.Repository ->       -- repository : TInterface (Name {namespace = "Ggit", name = "Repository"})
    CString ->                              -- name : TBasicType TUTF8
    CString ->                              -- url : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr Remote)

{- |
Creates a remote with the default refspecs in memory. You can use
this when you have a URL instead of a remote\'s name.
-}
remoteNew ::
    (B.CallStack.HasCallStack, MonadIO m, Ggit.Repository.IsRepository a) =>
    a
    {- ^ /@repository@/: a 'GI.Ggit.Objects.Repository.Repository'. -}
    -> T.Text
    {- ^ /@name@/: the remote\'s name. -}
    -> T.Text
    {- ^ /@url@/: the remote repository\'s URL. -}
    -> m (Maybe Remote)
    {- ^ __Returns:__ a newly allocated 'GI.Ggit.Objects.Remote.Remote' or 'Nothing'. /(Can throw 'Data.GI.Base.GError.GError')/ -}
remoteNew repository name url = liftIO $ do
    repository' <- unsafeManagedPtrCastPtr repository
    name' <- textToCString name
    url' <- textToCString url
    onException (do
        result <- propagateGError $ ggit_remote_new repository' name' url'
        maybeResult <- convertIfNonNull result $ \result' -> do
            result'' <- (wrapObject Remote) result'
            return result''
        touchManagedPtr repository
        freeMem name'
        freeMem url'
        return maybeResult
     ) (do
        freeMem name'
        freeMem url'
     )

#if ENABLE_OVERLOADING
#endif

-- method Remote::new_anonymous
-- method type : Constructor
-- Args : [Arg {argCName = "repository", argType = TInterface (Name {namespace = "Ggit", name = "Repository"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRepository.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "url", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the remote repository's URL.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Ggit", name = "Remote"}))
-- throws : True
-- Skip return : False

foreign import ccall "ggit_remote_new_anonymous" ggit_remote_new_anonymous ::
    Ptr Ggit.Repository.Repository ->       -- repository : TInterface (Name {namespace = "Ggit", name = "Repository"})
    CString ->                              -- url : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr Remote)

{- |
Creates a remote with the specified refspec in memory. You can use
this when you have a URL instead of a remote\'s name.
-}
remoteNewAnonymous ::
    (B.CallStack.HasCallStack, MonadIO m, Ggit.Repository.IsRepository a) =>
    a
    {- ^ /@repository@/: a 'GI.Ggit.Objects.Repository.Repository'. -}
    -> T.Text
    {- ^ /@url@/: the remote repository\'s URL. -}
    -> m (Maybe Remote)
    {- ^ __Returns:__ a newly allocated 'GI.Ggit.Objects.Remote.Remote' or 'Nothing'. /(Can throw 'Data.GI.Base.GError.GError')/ -}
remoteNewAnonymous repository url = liftIO $ do
    repository' <- unsafeManagedPtrCastPtr repository
    url' <- textToCString url
    onException (do
        result <- propagateGError $ ggit_remote_new_anonymous repository' url'
        maybeResult <- convertIfNonNull result $ \result' -> do
            result'' <- (wrapObject Remote) result'
            return result''
        touchManagedPtr repository
        freeMem url'
        return maybeResult
     ) (do
        freeMem url'
     )

#if ENABLE_OVERLOADING
#endif

-- method Remote::connect
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Ggit", name = "Remote"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRemote.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "direction", argType = TInterface (Name {namespace = "Ggit", name = "Direction"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "whether you want to receive or send data.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "callbacks", argType = TInterface (Name {namespace = "Ggit", name = "RemoteCallbacks"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the callbacks to use for this connection.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "proxy_options", argType = TInterface (Name {namespace = "Ggit", name = "ProxyOptions"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the proxy options.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "custom_headers", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "extra HTTP headers to use in this connection.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : True
-- Skip return : False

foreign import ccall "ggit_remote_connect" ggit_remote_connect ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    CUInt ->                                -- direction : TInterface (Name {namespace = "Ggit", name = "Direction"})
    Ptr Ggit.RemoteCallbacks.RemoteCallbacks -> -- callbacks : TInterface (Name {namespace = "Ggit", name = "RemoteCallbacks"})
    Ptr Ggit.ProxyOptions.ProxyOptions ->   -- proxy_options : TInterface (Name {namespace = "Ggit", name = "ProxyOptions"})
    CString ->                              -- custom_headers : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO ()

{- |
Opens a connection to a remote.
The transport is selected based on the URL. The direction argument
is due to a limitation of the git protocol (over TCP or SSH) which
starts up a specific binary which can only do the one or the other.
-}
remoteConnect ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a, Ggit.RemoteCallbacks.IsRemoteCallbacks b, Ggit.ProxyOptions.IsProxyOptions c) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> Ggit.Enums.Direction
    {- ^ /@direction@/: whether you want to receive or send data. -}
    -> b
    {- ^ /@callbacks@/: the callbacks to use for this connection. -}
    -> Maybe (c)
    {- ^ /@proxyOptions@/: the proxy options. -}
    -> Maybe (T.Text)
    {- ^ /@customHeaders@/: extra HTTP headers to use in this connection. -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
remoteConnect remote direction callbacks proxyOptions customHeaders = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    let direction' = (fromIntegral . fromEnum) direction
    callbacks' <- unsafeManagedPtrCastPtr callbacks
    maybeProxyOptions <- case proxyOptions of
        Nothing -> return nullPtr
        Just jProxyOptions -> do
            jProxyOptions' <- unsafeManagedPtrCastPtr jProxyOptions
            return jProxyOptions'
    maybeCustomHeaders <- case customHeaders of
        Nothing -> return nullPtr
        Just jCustomHeaders -> do
            jCustomHeaders' <- textToCString jCustomHeaders
            return jCustomHeaders'
    onException (do
        propagateGError $ ggit_remote_connect remote' direction' callbacks' maybeProxyOptions maybeCustomHeaders
        touchManagedPtr remote
        touchManagedPtr callbacks
        whenJust proxyOptions touchManagedPtr
        freeMem maybeCustomHeaders
        return ()
     ) (do
        freeMem maybeCustomHeaders
     )

#if ENABLE_OVERLOADING
data RemoteConnectMethodInfo
instance (signature ~ (Ggit.Enums.Direction -> b -> Maybe (c) -> Maybe (T.Text) -> m ()), MonadIO m, IsRemote a, Ggit.RemoteCallbacks.IsRemoteCallbacks b, Ggit.ProxyOptions.IsProxyOptions c) => O.MethodInfo RemoteConnectMethodInfo a signature where
    overloadedMethod _ = remoteConnect

#endif

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

foreign import ccall "ggit_remote_disconnect" ggit_remote_disconnect ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    IO ()

{- |
Closes the connection to the remote and frees the underlying
transport.
-}
remoteDisconnect ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> m ()
remoteDisconnect remote = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    ggit_remote_disconnect remote'
    touchManagedPtr remote
    return ()

#if ENABLE_OVERLOADING
data RemoteDisconnectMethodInfo
instance (signature ~ (m ()), MonadIO m, IsRemote a) => O.MethodInfo RemoteDisconnectMethodInfo a signature where
    overloadedMethod _ = remoteDisconnect

#endif

-- method Remote::download
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Ggit", name = "Remote"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRemote.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "specs", argType = TCArray True (-1) (-1) (TBasicType TUTF8), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the ref specs.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "fetch_options", argType = TInterface (Name {namespace = "Ggit", name = "FetchOptions"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitFetchOptions.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : True
-- Skip return : False

foreign import ccall "ggit_remote_download" ggit_remote_download ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    Ptr CString ->                          -- specs : TCArray True (-1) (-1) (TBasicType TUTF8)
    Ptr Ggit.FetchOptions.FetchOptions ->   -- fetch_options : TInterface (Name {namespace = "Ggit", name = "FetchOptions"})
    Ptr (Ptr GError) ->                     -- error
    IO CInt

{- |
Connect to the remote if not yet connected, negotiate with the remote
about which objects are missing and download the resulting packfile and
its index.
-}
remoteDownload ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> Maybe ([T.Text])
    {- ^ /@specs@/: the ref specs. -}
    -> Ggit.FetchOptions.FetchOptions
    {- ^ /@fetchOptions@/: a 'GI.Ggit.Structs.FetchOptions.FetchOptions'. -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
remoteDownload remote specs fetchOptions = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    maybeSpecs <- case specs of
        Nothing -> return nullPtr
        Just jSpecs -> do
            jSpecs' <- packZeroTerminatedUTF8CArray jSpecs
            return jSpecs'
    fetchOptions' <- unsafeManagedPtrGetPtr fetchOptions
    onException (do
        _ <- propagateGError $ ggit_remote_download remote' maybeSpecs fetchOptions'
        touchManagedPtr remote
        touchManagedPtr fetchOptions
        mapZeroTerminatedCArray freeMem maybeSpecs
        freeMem maybeSpecs
        return ()
     ) (do
        mapZeroTerminatedCArray freeMem maybeSpecs
        freeMem maybeSpecs
     )

#if ENABLE_OVERLOADING
data RemoteDownloadMethodInfo
instance (signature ~ (Maybe ([T.Text]) -> Ggit.FetchOptions.FetchOptions -> m ()), MonadIO m, IsRemote a) => O.MethodInfo RemoteDownloadMethodInfo a signature where
    overloadedMethod _ = remoteDownload

#endif

-- method Remote::get_connected
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Ggit", name = "Remote"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRemote.", 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_remote_get_connected" ggit_remote_get_connected ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    IO CInt

{- |
Check whether /@remote@/ is connected.
-}
remoteGetConnected ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> m Bool
    {- ^ __Returns:__ 'True' if it is connected. -}
remoteGetConnected remote = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    result <- ggit_remote_get_connected remote'
    let result' = (/= 0) result
    touchManagedPtr remote
    return result'

#if ENABLE_OVERLOADING
data RemoteGetConnectedMethodInfo
instance (signature ~ (m Bool), MonadIO m, IsRemote a) => O.MethodInfo RemoteGetConnectedMethodInfo a signature where
    overloadedMethod _ = remoteGetConnected

#endif

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

foreign import ccall "ggit_remote_get_fetch_specs" ggit_remote_get_fetch_specs ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr CString)

{- |
Get the list of fetch refspecs for the given remote.
-}
remoteGetFetchSpecs ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> m (Maybe [T.Text])
    {- ^ __Returns:__ a list of fetch refspecs or 'Nothing'. /(Can throw 'Data.GI.Base.GError.GError')/ -}
remoteGetFetchSpecs remote = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    onException (do
        result <- propagateGError $ ggit_remote_get_fetch_specs remote'
        maybeResult <- convertIfNonNull result $ \result' -> do
            result'' <- unpackZeroTerminatedUTF8CArray result'
            mapZeroTerminatedCArray freeMem result'
            freeMem result'
            return result''
        touchManagedPtr remote
        return maybeResult
     ) (do
        return ()
     )

#if ENABLE_OVERLOADING
data RemoteGetFetchSpecsMethodInfo
instance (signature ~ (m (Maybe [T.Text])), MonadIO m, IsRemote a) => O.MethodInfo RemoteGetFetchSpecsMethodInfo a signature where
    overloadedMethod _ = remoteGetFetchSpecs

#endif

-- method Remote::get_name
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Ggit", name = "Remote"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRemote.", 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_remote_get_name" ggit_remote_get_name ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    IO CString

{- |
Gets the remote\'s name.
-}
remoteGetName ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> m (Maybe T.Text)
    {- ^ __Returns:__ the name of /@remote@/ or 'Nothing'. -}
remoteGetName remote = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    result <- ggit_remote_get_name remote'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- cstringToText result'
        return result''
    touchManagedPtr remote
    return maybeResult

#if ENABLE_OVERLOADING
data RemoteGetNameMethodInfo
instance (signature ~ (m (Maybe T.Text)), MonadIO m, IsRemote a) => O.MethodInfo RemoteGetNameMethodInfo a signature where
    overloadedMethod _ = remoteGetName

#endif

-- method Remote::get_owner
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Ggit", name = "Remote"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRemote.", 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_remote_get_owner" ggit_remote_get_owner ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    IO (Ptr Ggit.Repository.Repository)

{- |
Gets the repository where /@remote@/ resides.
-}
remoteGetOwner ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> m (Maybe Ggit.Repository.Repository)
    {- ^ __Returns:__ the repository where the remote resides or 'Nothing'. -}
remoteGetOwner remote = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    result <- ggit_remote_get_owner remote'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (wrapObject Ggit.Repository.Repository) result'
        return result''
    touchManagedPtr remote
    return maybeResult

#if ENABLE_OVERLOADING
data RemoteGetOwnerMethodInfo
instance (signature ~ (m (Maybe Ggit.Repository.Repository)), MonadIO m, IsRemote a) => O.MethodInfo RemoteGetOwnerMethodInfo a signature where
    overloadedMethod _ = remoteGetOwner

#endif

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

foreign import ccall "ggit_remote_get_push_specs" ggit_remote_get_push_specs ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr CString)

{- |
Get the list of push refspecs for the given remote.
-}
remoteGetPushSpecs ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> m (Maybe [T.Text])
    {- ^ __Returns:__ a list of push refspecs or 'Nothing'. /(Can throw 'Data.GI.Base.GError.GError')/ -}
remoteGetPushSpecs remote = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    onException (do
        result <- propagateGError $ ggit_remote_get_push_specs remote'
        maybeResult <- convertIfNonNull result $ \result' -> do
            result'' <- unpackZeroTerminatedUTF8CArray result'
            mapZeroTerminatedCArray freeMem result'
            freeMem result'
            return result''
        touchManagedPtr remote
        return maybeResult
     ) (do
        return ()
     )

#if ENABLE_OVERLOADING
data RemoteGetPushSpecsMethodInfo
instance (signature ~ (m (Maybe [T.Text])), MonadIO m, IsRemote a) => O.MethodInfo RemoteGetPushSpecsMethodInfo a signature where
    overloadedMethod _ = remoteGetPushSpecs

#endif

-- method Remote::get_url
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Ggit", name = "Remote"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "GgitRemote.", 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_remote_get_url" ggit_remote_get_url ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    IO CString

{- |
Gets the remote\'s url.
-}
remoteGetUrl ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a) =>
    a
    {- ^ /@remote@/: GgitRemote. -}
    -> m (Maybe T.Text)
    {- ^ __Returns:__ the url of /@remote@/ or 'Nothing'. -}
remoteGetUrl remote = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    result <- ggit_remote_get_url remote'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- cstringToText result'
        return result''
    touchManagedPtr remote
    return maybeResult

#if ENABLE_OVERLOADING
data RemoteGetUrlMethodInfo
instance (signature ~ (m (Maybe T.Text)), MonadIO m, IsRemote a) => O.MethodInfo RemoteGetUrlMethodInfo a signature where
    overloadedMethod _ = remoteGetUrl

#endif

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

foreign import ccall "ggit_remote_list" ggit_remote_list ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    Ptr (Ptr GError) ->                     -- error
    IO (Ptr (Ptr Ggit.RemoteHead.RemoteHead))

{- |
Get a list of refs at the remote.
-}
remoteList ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> m (Maybe [Ggit.RemoteHead.RemoteHead])
    {- ^ __Returns:__ the remote heads or 'Nothing'. /(Can throw 'Data.GI.Base.GError.GError')/ -}
remoteList remote = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    onException (do
        result <- propagateGError $ ggit_remote_list remote'
        maybeResult <- convertIfNonNull result $ \result' -> do
            result'' <- unpackZeroTerminatedPtrArray result'
            result''' <- mapM (wrapBoxed Ggit.RemoteHead.RemoteHead) result''
            freeMem result'
            return result'''
        touchManagedPtr remote
        return maybeResult
     ) (do
        return ()
     )

#if ENABLE_OVERLOADING
data RemoteListMethodInfo
instance (signature ~ (m (Maybe [Ggit.RemoteHead.RemoteHead])), MonadIO m, IsRemote a) => O.MethodInfo RemoteListMethodInfo a signature where
    overloadedMethod _ = remoteList

#endif

-- method Remote::push
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Ggit", name = "Remote"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRemote.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "specs", argType = TCArray True (-1) (-1) (TBasicType TUTF8), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the ref specs.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "push_options", argType = TInterface (Name {namespace = "Ggit", name = "PushOptions"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitPushOptions.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : True
-- Skip return : False

foreign import ccall "ggit_remote_push" ggit_remote_push ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    Ptr CString ->                          -- specs : TCArray True (-1) (-1) (TBasicType TUTF8)
    Ptr Ggit.PushOptions.PushOptions ->     -- push_options : TInterface (Name {namespace = "Ggit", name = "PushOptions"})
    Ptr (Ptr GError) ->                     -- error
    IO CInt

{- |
Connect to the remote if not yet connected, negotiate with the remote
about which objects are missing, create a packfile with the missing
objects and send it.
-}
remotePush ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a, Ggit.PushOptions.IsPushOptions b) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> Maybe ([T.Text])
    {- ^ /@specs@/: the ref specs. -}
    -> b
    {- ^ /@pushOptions@/: a 'GI.Ggit.Objects.PushOptions.PushOptions'. -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
remotePush remote specs pushOptions = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    maybeSpecs <- case specs of
        Nothing -> return nullPtr
        Just jSpecs -> do
            jSpecs' <- packZeroTerminatedUTF8CArray jSpecs
            return jSpecs'
    pushOptions' <- unsafeManagedPtrCastPtr pushOptions
    onException (do
        _ <- propagateGError $ ggit_remote_push remote' maybeSpecs pushOptions'
        touchManagedPtr remote
        touchManagedPtr pushOptions
        mapZeroTerminatedCArray freeMem maybeSpecs
        freeMem maybeSpecs
        return ()
     ) (do
        mapZeroTerminatedCArray freeMem maybeSpecs
        freeMem maybeSpecs
     )

#if ENABLE_OVERLOADING
data RemotePushMethodInfo
instance (signature ~ (Maybe ([T.Text]) -> b -> m ()), MonadIO m, IsRemote a, Ggit.PushOptions.IsPushOptions b) => O.MethodInfo RemotePushMethodInfo a signature where
    overloadedMethod _ = remotePush

#endif

-- method Remote::update_tips
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Ggit", name = "Remote"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRemote.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "callbacks", argType = TInterface (Name {namespace = "Ggit", name = "RemoteCallbacks"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRemoteCallbacks.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "update_fetch_head", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "whether to write to FETCH_HEAD. %TRUE to behave like git.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "tags_type", argType = TInterface (Name {namespace = "Ggit", name = "RemoteDownloadTagsType"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "what the behaviour for downloading tags is for this fetch. This is\n            ignored for push. This must be the same value passed to\n            ggit_remote_download().", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "message", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "reflog_message The message to insert into the reflogs. If\n                        %NULL and fetching, the default is \"fetch <name>\",\n                        where <name> is the name of the remote (or its url,\n                        for in-memory remotes). This parameter is ignored when pushing.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : True
-- Skip return : False

foreign import ccall "ggit_remote_update_tips" ggit_remote_update_tips ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    Ptr Ggit.RemoteCallbacks.RemoteCallbacks -> -- callbacks : TInterface (Name {namespace = "Ggit", name = "RemoteCallbacks"})
    CInt ->                                 -- update_fetch_head : TBasicType TBoolean
    CUInt ->                                -- tags_type : TInterface (Name {namespace = "Ggit", name = "RemoteDownloadTagsType"})
    CString ->                              -- message : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO CInt

{- |
Update tips to the new state.
-}
remoteUpdateTips ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a, Ggit.RemoteCallbacks.IsRemoteCallbacks b) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> b
    {- ^ /@callbacks@/: a 'GI.Ggit.Objects.RemoteCallbacks.RemoteCallbacks'. -}
    -> Bool
    {- ^ /@updateFetchHead@/: whether to write to FETCH_HEAD. 'True' to behave like git. -}
    -> Ggit.Enums.RemoteDownloadTagsType
    {- ^ /@tagsType@/: what the behaviour for downloading tags is for this fetch. This is
            ignored for push. This must be the same value passed to
            'GI.Ggit.Objects.Remote.remoteDownload'. -}
    -> Maybe (T.Text)
    {- ^ /@message@/: reflog_message The message to insert into the reflogs. If
                        'Nothing' and fetching, the default is \"fetch \<name>\",
                        where \<name> is the name of the remote (or its url,
                        for in-memory remotes). This parameter is ignored when pushing. -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
remoteUpdateTips remote callbacks updateFetchHead tagsType message = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    callbacks' <- unsafeManagedPtrCastPtr callbacks
    let updateFetchHead' = (fromIntegral . fromEnum) updateFetchHead
    let tagsType' = (fromIntegral . fromEnum) tagsType
    maybeMessage <- case message of
        Nothing -> return nullPtr
        Just jMessage -> do
            jMessage' <- textToCString jMessage
            return jMessage'
    onException (do
        _ <- propagateGError $ ggit_remote_update_tips remote' callbacks' updateFetchHead' tagsType' maybeMessage
        touchManagedPtr remote
        touchManagedPtr callbacks
        freeMem maybeMessage
        return ()
     ) (do
        freeMem maybeMessage
     )

#if ENABLE_OVERLOADING
data RemoteUpdateTipsMethodInfo
instance (signature ~ (b -> Bool -> Ggit.Enums.RemoteDownloadTagsType -> Maybe (T.Text) -> m ()), MonadIO m, IsRemote a, Ggit.RemoteCallbacks.IsRemoteCallbacks b) => O.MethodInfo RemoteUpdateTipsMethodInfo a signature where
    overloadedMethod _ = remoteUpdateTips

#endif

-- method Remote::upload
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "remote", argType = TInterface (Name {namespace = "Ggit", name = "Remote"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitRemote.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "specs", argType = TCArray True (-1) (-1) (TBasicType TUTF8), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "the ref specs.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "push_options", argType = TInterface (Name {namespace = "Ggit", name = "PushOptions"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GgitPushOptions", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : True
-- Skip return : False

foreign import ccall "ggit_remote_upload" ggit_remote_upload ::
    Ptr Remote ->                           -- remote : TInterface (Name {namespace = "Ggit", name = "Remote"})
    Ptr CString ->                          -- specs : TCArray True (-1) (-1) (TBasicType TUTF8)
    Ptr Ggit.PushOptions.PushOptions ->     -- push_options : TInterface (Name {namespace = "Ggit", name = "PushOptions"})
    Ptr (Ptr GError) ->                     -- error
    IO CInt

{- |
Create a packfile and send it to the server
-}
remoteUpload ::
    (B.CallStack.HasCallStack, MonadIO m, IsRemote a, Ggit.PushOptions.IsPushOptions b) =>
    a
    {- ^ /@remote@/: a 'GI.Ggit.Objects.Remote.Remote'. -}
    -> Maybe ([T.Text])
    {- ^ /@specs@/: the ref specs. -}
    -> b
    {- ^ /@pushOptions@/: a 'GI.Ggit.Objects.PushOptions.PushOptions' -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
remoteUpload remote specs pushOptions = liftIO $ do
    remote' <- unsafeManagedPtrCastPtr remote
    maybeSpecs <- case specs of
        Nothing -> return nullPtr
        Just jSpecs -> do
            jSpecs' <- packZeroTerminatedUTF8CArray jSpecs
            return jSpecs'
    pushOptions' <- unsafeManagedPtrCastPtr pushOptions
    onException (do
        _ <- propagateGError $ ggit_remote_upload remote' maybeSpecs pushOptions'
        touchManagedPtr remote
        touchManagedPtr pushOptions
        mapZeroTerminatedCArray freeMem maybeSpecs
        freeMem maybeSpecs
        return ()
     ) (do
        mapZeroTerminatedCArray freeMem maybeSpecs
        freeMem maybeSpecs
     )

#if ENABLE_OVERLOADING
data RemoteUploadMethodInfo
instance (signature ~ (Maybe ([T.Text]) -> b -> m ()), MonadIO m, IsRemote a, Ggit.PushOptions.IsPushOptions b) => O.MethodInfo RemoteUploadMethodInfo a signature where
    overloadedMethod _ = remoteUpload

#endif