]> git.proxmox.com Git - libgit2.git/commitdiff
worktree: introduce git_worktree_add options
authorPatrick Steinhardt <ps@pks.im>
Tue, 2 May 2017 08:02:36 +0000 (10:02 +0200)
committerPatrick Steinhardt <ps@pks.im>
Tue, 2 May 2017 10:39:29 +0000 (12:39 +0200)
The `git_worktree_add` function currently accepts only a path and name
for the new work tree. As we may want to expand these parameters in
future versions without adding additional parameters to the function for
every option, this commit introduces our typical pattern of an options
struct. Right now, this structure is still empty, which will change with
the next commit.

include/git2/worktree.h
src/worktree.c
tests/worktree/submodule.c
tests/worktree/worktree.c

index 4c4f9284da439e03b473fafabe2c8b34a2772abc..bc1e4024329a568ac7642a2c83cb7d294b01bd52 100644 (file)
@@ -74,6 +74,25 @@ GIT_EXTERN(void) git_worktree_free(git_worktree *wt);
  */
 GIT_EXTERN(int) git_worktree_validate(const git_worktree *wt);
 
+typedef struct git_worktree_add_options {
+       unsigned int version;
+} git_worktree_add_options;
+
+#define GIT_WORKTREE_ADD_OPTIONS_VERSION 1
+#define GIT_WORKTREE_ADD_OPTIONS_INIT {GIT_WORKTREE_ADD_OPTIONS_VERSION}
+
+/**
+ * Initializes a `git_worktree_add_options` with default vaules.
+ * Equivalent to creating an instance with
+ * GIT_WORKTREE_ADD_OPTIONS_INIT.
+ *
+ * @param opts the struct to initialize
+ * @param version Verison of struct; pass `GIT_WORKTREE_ADD_OPTIONS_VERSION`
+ * @return Zero on success; -1 on failure.
+ */
+int git_worktree_add_init_options(git_worktree_add_options *opts,
+       unsigned int version);
+
 /**
  * Add a new working tree
  *
@@ -85,9 +104,12 @@ GIT_EXTERN(int) git_worktree_validate(const git_worktree *wt);
  * @param repo Repository to create working tree for
  * @param name Name of the working tree
  * @param path Path to create working tree at
+ * @param opts Options to modify default behavior. May be NULL
  * @return 0 or an error code
  */
-GIT_EXTERN(int) git_worktree_add(git_worktree **out, git_repository *repo, const char *name, const char *path);
+GIT_EXTERN(int) git_worktree_add(git_worktree **out, git_repository *repo,
+       const char *name, const char *path,
+       const git_worktree_add_options *opts);
 
 /**
  * Lock worktree if not already locked
index 55fbf520483cb35e254a53de1331e9cfde34e6a2..6e797f362722b72420e1048545780561dae21eda 100644 (file)
@@ -269,15 +269,32 @@ out:
        return err;
 }
 
-int git_worktree_add(git_worktree **out, git_repository *repo, const char *name, const char *worktree)
+int git_worktree_add_init_options(git_worktree_add_options *opts,
+       unsigned int version)
+{
+       GIT_INIT_STRUCTURE_FROM_TEMPLATE(opts, version,
+               git_worktree_add_options, GIT_WORKTREE_ADD_OPTIONS_INIT);
+       return 0;
+}
+
+int git_worktree_add(git_worktree **out, git_repository *repo,
+       const char *name, const char *worktree,
+       const git_worktree_add_options *opts)
 {
        git_buf gitdir = GIT_BUF_INIT, wddir = GIT_BUF_INIT, buf = GIT_BUF_INIT;
        git_reference *ref = NULL, *head = NULL;
        git_commit *commit = NULL;
        git_repository *wt = NULL;
        git_checkout_options coopts = GIT_CHECKOUT_OPTIONS_INIT;
+       git_worktree_add_options wtopts = GIT_WORKTREE_ADD_OPTIONS_INIT;
        int err;
 
+       GITERR_CHECK_VERSION(
+               opts, GIT_WORKTREE_ADD_OPTIONS_VERSION, "git_worktree_add_options");
+
+       if (opts)
+               memcpy(&wtopts, opts, sizeof(wtopts));
+
        assert(out && repo && name && worktree);
 
        *out = NULL;
index 5620775970b9f8617264489fba330292d5820305..2943852265c901251b03bc2350bc173413c23d05 100644 (file)
@@ -74,7 +74,7 @@ void test_worktree_submodule__resolve_relative_url(void)
        cl_git_pass(git_repository_open(&child.repo, WORKTREE_CHILD));
 
        /* Create worktree of submodule repository */
-       cl_git_pass(git_worktree_add(&wt, child.repo, "subdir", wt_path.ptr));
+       cl_git_pass(git_worktree_add(&wt, child.repo, "subdir", wt_path.ptr, NULL));
        cl_git_pass(git_repository_open_from_worktree(&repo, wt));
 
        cl_git_pass(git_submodule_resolve_url(&sm_relative_path, repo,
index 73991bff7b2cfa12b468d6255a43adbacd65fa2a..f90895822265cb13e607b230ad9ce3b0375eee21 100644 (file)
@@ -215,7 +215,7 @@ void test_worktree_worktree__init(void)
        git_buf path = GIT_BUF_INIT;
 
        cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-new"));
-       cl_git_pass(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr));
+       cl_git_pass(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr, NULL));
 
        /* Open and verify created repo */
        cl_git_pass(git_repository_open(&repo, path.ptr));
@@ -240,7 +240,7 @@ void test_worktree_worktree__init_existing_branch(void)
        cl_git_pass(git_branch_create(&branch, fixture.repo, "worktree-new", commit, false));
 
        cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-new"));
-       cl_git_fail(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr));
+       cl_git_fail(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr, NULL));
 
        git_buf_free(&path);
        git_commit_free(commit);
@@ -254,7 +254,7 @@ void test_worktree_worktree__init_existing_worktree(void)
        git_buf path = GIT_BUF_INIT;
 
        cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../worktree-new"));
-       cl_git_fail(git_worktree_add(&wt, fixture.repo, "testrepo-worktree", path.ptr));
+       cl_git_fail(git_worktree_add(&wt, fixture.repo, "testrepo-worktree", path.ptr, NULL));
 
        cl_git_pass(git_worktree_lookup(&wt, fixture.repo, "testrepo-worktree"));
        cl_assert_equal_s(wt->gitlink_path, fixture.worktree->gitlink);
@@ -279,7 +279,7 @@ void test_worktree_worktree__init_existing_path(void)
        }
 
        cl_git_pass(git_buf_joinpath(&path, fixture.repo->workdir, "../testrepo-worktree"));
-       cl_git_fail(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr));
+       cl_git_fail(git_worktree_add(&wt, fixture.repo, "worktree-new", path.ptr, NULL));
 
        /* Verify files have not been re-created */
        for (i = 0; i < ARRAY_SIZE(wtfiles); i++) {
@@ -303,7 +303,7 @@ void test_worktree_worktree__init_submodule(void)
        cl_git_pass(git_buf_joinpath(&path, repo->workdir, "sm_unchanged"));
        cl_git_pass(git_repository_open(&sm, path.ptr));
        cl_git_pass(git_buf_joinpath(&path, repo->workdir, "../worktree/"));
-       cl_git_pass(git_worktree_add(&worktree, sm, "repo-worktree", path.ptr));
+       cl_git_pass(git_worktree_add(&worktree, sm, "repo-worktree", path.ptr, NULL));
        cl_git_pass(git_repository_open_from_worktree(&wt, worktree));
 
        cl_git_pass(git_path_prettify_dir(&path, path.ptr, NULL));