Как клонировать репо вместе с подмодулями в libgit2 - PullRequest
0 голосов
/ 12 марта 2019

Кажется, я не могу найти никаких примеров того, как это делается.

Я пытаюсь эмулировать команду: git clone --recurse-submodules <repo>

Можно ли даже включить субмодули при клонировании с использованием libgit2? Я не уверен в этом.

Вот мой код, который выполняет клонирование и работает, за исключением подмодулей.

int my_git_cred_cb(git_cred **cred, const char *url, const char *username_from_url, unsigned int allowed_types, void *payload)
{
     return git_cred_userpass_plaintext_new(cred, "user", "pass");
}

void checkout_progress(
            const char *path,
            size_t cur,
            size_t tot,
            void *payload)
{
  progress_data *pd = (progress_data*)payload;
  /* Do something with checkout progress */
}

int fetch_progress(
            const git_transfer_progress *stats,
            void *payload)
{
  progress_data *pd = (progress_data*)payload;
  int fetch_percent =
          (100 * stats->received_objects) /
          stats->total_objects;
      int index_percent =
          (100 * stats->indexed_objects) /
          stats->total_objects;
      int kbytes = stats->received_bytes / 1024;

      printf("network %3d%% (%4d kb, %5d/%5d)  /"
              "  index %3d%% (%5d/%5d)\n",
              fetch_percent, kbytes,
              stats->received_objects, stats->total_objects,
              index_percent,
              stats->indexed_objects, stats->total_objects);

      if(stats->indexed_objects >= stats->total_objects) {
          printf("COMPLETE=1\n");
          COMPLETE = 1;
      }
  /* Do something with network transfer progress */
  return 0;

}

int cloneRepo()
{
    git_repository *repo = NULL;
    progress_data d = {0};
    git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT;
    git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT;

    clone_opts.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE;
    clone_opts.checkout_opts.progress_cb = checkout_progress;
    clone_opts.checkout_opts.progress_payload = &d;
    clone_opts.checkout_opts = checkout_opts;
    clone_opts.fetch_opts.callbacks.transfer_progress = fetch_progress;
    clone_opts.fetch_opts.callbacks.payload = &d;

    clone_opts.fetch_opts.callbacks.credentials = my_git_cred_cb;

    int error = git_repository_open_bare(&repo, repoDir);

    if(error == -3)
    {
        //clone from github
        int index = ui->selectTestPlans->currentIndex();
        if(index)
        {
             std::cout << "Preparing to clone from ALL_TESTPLANS repo" << std::endl;
             //clone ALL_TESTPLANS repo
             error = git_clone(&repo, "repo.git", "dir/path", &clone_opts);
             std::cout << "Error code: " << error << std::endl;
             return 0;
        }    
    }  
}

Я просмотрел git_clone_options и не могу найти ничего, касающегося включения подмодулей. Есть ли другая структура, которую я должен настроить для этого?

...