File: remote.scm

package info (click to toggle)
guile-git 0.9.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 892 kB
  • sloc: lisp: 6,231; makefile: 132; sh: 8
file content (169 lines) | stat: -rw-r--r-- 6,357 bytes parent folder | download
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