]> git.proxmox.com Git - libgit2.git/blobdiff - examples/network/ls-remote.c
Adding credentials callback to ls-remote and fetch too.
[libgit2.git] / examples / network / ls-remote.c
index 77a9f215d10a37d439dd9673a31dce67856a32dc..b22ac47a0f52394c361210621a1cd7fa3c0251ed 100644 (file)
@@ -4,83 +4,39 @@
 #include <string.h>
 #include "common.h"
 
-static void show_refs(git_headarray *refs)
+static int show_ref__cb(git_remote_head *head, void *payload)
 {
-       int i;
-       git_remote_head *head;
+       char oid[GIT_OID_HEXSZ + 1] = {0};
 
-// Take each head that the remote has advertised, store the string
-// representation of the OID in a buffer and print it
-
-       for(i = 0; i < refs->len; ++i){
-               char oid[GIT_OID_HEXSZ + 1] = {0};
-               head = refs->heads[i];
-               git_oid_fmt(oid, &head->oid);
-               printf("%s\t%s\n", oid, head->name);
-       }
-}
-
-int use_unnamed(git_repository *repo, const char *url)
-{
-       git_remote *remote = NULL;
-       git_headarray refs;
-       int error;
-
-       // Create an instance of a remote from the URL. The transport to use
-       // is detected from the URL
-       error = git_remote_new(&remote, repo, url);
-       if (error < GIT_SUCCESS)
-               goto cleanup;
-
-       // When connecting, the underlying code needs to know wether we
-       // want to push or fetch
-       error = git_remote_connect(remote, GIT_DIR_FETCH);
-       if (error < GIT_SUCCESS)
-               goto cleanup;
-
-       // With git_remote_ls we can retrieve the advertised heads
-       error = git_remote_ls(remote, &refs);
-       if (error < GIT_SUCCESS)
-               goto cleanup;
-
-       show_refs(&refs);
-
-cleanup:
-       git_remote_free(remote);
-
-       return error;
+       (void)payload;
+       git_oid_fmt(oid, &head->oid);
+       printf("%s\t%s\n", oid, head->name);
+       return 0;
 }
 
-int use_remote(git_repository *repo, char *name)
+static int use_remote(git_repository *repo, char *name)
 {
        git_remote *remote = NULL;
-       git_config *cfg = NULL;
-       git_headarray refs;
        int error;
 
-       // Load the local configuration for the repository
-       error = git_repository_config(&cfg, repo, NULL, NULL);
-       if (error < GIT_SUCCESS)
-               return error;
-
        // Find the remote by name
-       error = git_remote_get(&remote, cfg, name);
-       if (error < GIT_SUCCESS)
-               goto cleanup;
+       error = git_remote_load(&remote, repo, name);
+       if (error < 0) {
+               error = git_remote_create_inmemory(&remote, repo, NULL, name);
+               if (error < 0)
+                       goto cleanup;
+       }
 
-       error = git_remote_connect(remote, GIT_DIR_FETCH);
-       if (error < GIT_SUCCESS)
-               goto cleanup;
+       git_remote_set_cred_acquire_cb(remote, &cred_acquire_cb, NULL);
 
-       error = git_remote_ls(remote, &refs);
-       if (error < GIT_SUCCESS)
+       error = git_remote_connect(remote, GIT_DIRECTION_FETCH);
+       if (error < 0)
                goto cleanup;
 
-       show_refs(&refs);
+       error = git_remote_ls(remote, &show_ref__cb, NULL);
 
 cleanup:
        git_remote_free(remote);
-
        return error;
 }
 
@@ -89,16 +45,14 @@ cleanup:
 
 int ls_remote(git_repository *repo, int argc, char **argv)
 {
-       git_headarray heads;
-       git_remote_head *head;
-       int error, i;
+       int error;
 
-       /* If there's a ':' in the name, assume it's an URL */
-       if (strchr(argv[1], ':') != NULL) {
-               error = use_unnamed(repo, argv[1]);
-       } else {
-               error = use_remote(repo, argv[1]);
+       if (argc < 2) {
+               fprintf(stderr, "usage: %s ls-remote <remote>\n", argv[-1]);
+               return EXIT_FAILURE;
        }
 
+       error = use_remote(repo, argv[1]);
+
        return error;
 }