1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
;;; Guile-Git --- GNU Guile bindings of libgit2
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2018 Jelle Licht <jlicht@fsfe.org>
;;; Copyright © 2021, 2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2022 Maxime Devos <maximedevos@telenet.be>
;;;
;;; This file is part of Guile-Git.
;;;
;;; Guile-Git is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or
;;; (at your option) any later version.
;;;
;;; Guile-Git is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;;; General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with Guile-Git. If not, see <http://www.gnu.org/licenses/>.
(define-module (git remote)
#:use-module (srfi srfi-9 gnu)
#:use-module (system foreign)
#:use-module (git bindings)
#:use-module (git fetch)
#:use-module (git structs)
#:use-module (git types)
#:export (remote-name
remote-url
remote-set-url!
remote-lookup
remote-fetch
remote-create-anonymous
remote-create-detached
remote-connected?
remote-connect
remote-connect/detached
remote-disconnect
remote-ls
remote-default-branch))
(define %remote-free (libgit2->pointer "git_remote_free"))
(define (pointer->remote! pointer)
(set-pointer-finalizer! pointer %remote-free)
(pointer->remote pointer))
(define remote-name
(let ((proc (libgit2->procedure '* "git_remote_name" '(*))))
(lambda (remote)
(pointer->string (proc (remote->pointer remote))))))
(define remote-url
(let ((proc (libgit2->procedure '* "git_remote_url" '(*))))
(lambda (remote)
"Return the URL of REMOTE, a \"remote\" as returned by
'remote-lookup'."
(pointer->string (proc (remote->pointer remote))))))
(define remote-set-url!
(let ((proc (libgit2->procedure* "git_remote_set_url" '(* * *))))
(lambda (repository remote url)
"Change the URL of REMOTE, a string, to URL."
(proc (repository->pointer repository) (string->pointer remote)
(string->pointer url)))))
(define remote-lookup
(let ((proc (libgit2->procedure* "git_remote_lookup" '(* * *))))
(lambda* (repository remote-name)
(let ((out (make-double-pointer)))
(proc out
(repository->pointer repository)
(string->pointer remote-name))
(pointer->remote! (dereference-pointer out))))))
(define remote-create-anonymous
(let ((proc (libgit2->procedure* "git_remote_create_anonymous" '(* * *))))
(lambda* (repository url)
(let ((out (make-double-pointer)))
(proc out
(repository->pointer repository)
(string->pointer url))
(pointer->remote! (dereference-pointer out))))))
(define remote-create-detached
(let ((proc (libgit2->procedure* "git_remote_create_detached" '(* *))))
(lambda* (url)
"Return an in-memory remote for URL without a connected local repository."
(let ((out (make-double-pointer)))
(proc out
(string->pointer url))
(pointer->remote! (dereference-pointer out))))))
(define remote-connected?
(let ((proc (libgit2->procedure int "git_remote_connected" '(*))))
(lambda* (remote)
(case (proc (remote->pointer remote))
((1) #t)
(else #f)))))
(define GIT_DIRECTION_FETCH 0)
(define remote-connect
;; TODO: calling this on detached remotes causes segfaults,
;; hence the remote-connect/detached work-around
(let ((proc (libgit2->procedure* "git_remote_connect" `(* ,int * * * )))) ;; XXX: actual types
(lambda* (remote)
(let ((remote-callbacks (make-remote-callbacks)))
(set-remote-callbacks-version! remote-callbacks 1)
(proc (remote->pointer remote)
GIT_DIRECTION_FETCH
(remote-callbacks->pointer remote-callbacks)
%null-pointer
%null-pointer)))))
(define remote-connect/detached
(let ((proc (libgit2->procedure* "git_remote_connect" `(* ,int * * * )))) ;; XXX: actual types
(lambda* (remote)
"Connect the detached remote."
(proc (remote->pointer remote)
GIT_DIRECTION_FETCH
%null-pointer
%null-pointer
%null-pointer))))
(define remote-disconnect
(let ((proc (libgit2->procedure void "git_remote_disconnect" '(*))))
(lambda (remote)
(proc (remote->pointer remote)))))
(define remote-ls
(let ((proc (libgit2->procedure* "git_remote_ls" '(* * *))))
(lambda* (remote)
(let ((out (make-double-pointer))
(size-ptr (make-size_t-pointer)))
(proc out size-ptr
(remote->pointer remote))
(pointer->remote-head-list (dereference-pointer out)
(pointer->size_t size-ptr))))))
(define remote-fetch
(let ((proc (libgit2->procedure* "git_remote_fetch" '(* * * *))))
(lambda* (remote #:key
(reflog-message "")
(fetch-options (make-fetch-options)))
(proc (remote->pointer remote)
;; FIXME https://libgit2.github.com/libgit2/#HEAD/type/git_strarray
%null-pointer
(fetch-options->pointer fetch-options)
(string->pointer reflog-message)))))
(define remote-default-branch
(let ((proc (libgit2->procedure* "git_remote_default_branch" '(* *))))
(lambda (remote)
"Return the name of REMOTE's default branch.
The default branch of a repository is the branch which HEAD points to. If
the remote does not support reporting this information directly, it performs
the guess as git does; that is, if there are multiple branches which point to
the same commit, the first one is chosen. If the master branch is a
candidate, it wins.
This procedure must be called after connecting REMOTE."
(let ((buffer (make-buffer)))
(proc buffer (remote->pointer remote))
(buffer-content/string buffer)))))
;; FIXME https://libgit2.github.com/libgit2/#HEAD/group/reset/git_reset_default
|