Re: [PATCH v2 13/19] pull: implement pulling into an unborn branch

2015-06-09 Thread Junio C Hamano
Paul Tan  writes:

>  /**
> + * "Pulls into void" by branching off merge_head.
> + */
> +static int pull_into_void(unsigned char merge_head[GIT_SHA1_RAWSZ],
> + unsigned char curr_head[GIT_SHA1_RAWSZ])
> +{

It is not wrong per-se, but is rather unusual (and misleading) to
specify the array-ness and array-size of parameters.  Our codebase
tends to prefer spelling it like so instead:

static int pull_into_void(unsigned char *merge_head,
  unsigned char *curr_head)
{

> + /*
> +  * Two-way merge: we claim the index is based on an empty tree,

s/claim/treat/ perhaps?

> +  * and try to fast-forward to HEAD. This ensures we will not lose
> +  * index/worktree changes that the user already made on the unborn
> +  * branch.
> +  */
> + if (checkout_fast_forward(EMPTY_TREE_SHA1_BIN, merge_head, 0))
> + return 1;
> +
> + if (update_ref("initial pull", "HEAD", merge_head, curr_head, 0, 
> UPDATE_REFS_DIE_ON_ERR))
> + return 1;
> +
> + return 0;
> +}
> +
> +/**
>   * Runs git-merge, returning its exit status.
>   */
>  static int run_merge(void)
> @@ -475,5 +497,10 @@ int cmd_pull(int argc, const char **argv, const char 
> *prefix)
>   if (!merge_heads.nr)
>   die_no_merge_candidates(repo, refspecs);
>  
> - return run_merge();
> + if (is_null_sha1(orig_head)) {
> + if (merge_heads.nr > 1)
> + die(_("Cannot merge multiple branches into empty 
> head."));
> + return pull_into_void(*merge_heads.sha1, curr_head);
> + } else
> + return run_merge();
>  }

Sensible.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 13/19] pull: implement pulling into an unborn branch

2015-06-02 Thread Paul Tan
b4dc085 (pull: merge into unborn by fast-forwarding from empty
tree, 2013-06-20) established git-pull's current behavior of pulling
into an unborn branch by fast-forwarding the work tree from an empty
tree to the merge head, then setting HEAD to the merge head.

Re-implement this behavior by introducing pull_into_void() which will be
called instead of run_merge() if HEAD is invalid.

Helped-by: Stephen Robin 
Signed-off-by: Paul Tan 
---
 builtin/pull.c | 29 -
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/builtin/pull.c b/builtin/pull.c
index 8db0db2..f0d4710 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -13,6 +13,7 @@
 #include "sha1-array.h"
 #include "remote.h"
 #include "dir.h"
+#include "refs.h"
 
 static const char * const pull_usage[] = {
N_("git pull [options] [ [...]]"),
@@ -367,6 +368,27 @@ static int run_fetch(const char *repo, const char 
**refspecs)
 }
 
 /**
+ * "Pulls into void" by branching off merge_head.
+ */
+static int pull_into_void(unsigned char merge_head[GIT_SHA1_RAWSZ],
+   unsigned char curr_head[GIT_SHA1_RAWSZ])
+{
+   /*
+* Two-way merge: we claim the index is based on an empty tree,
+* and try to fast-forward to HEAD. This ensures we will not lose
+* index/worktree changes that the user already made on the unborn
+* branch.
+*/
+   if (checkout_fast_forward(EMPTY_TREE_SHA1_BIN, merge_head, 0))
+   return 1;
+
+   if (update_ref("initial pull", "HEAD", merge_head, curr_head, 0, 
UPDATE_REFS_DIE_ON_ERR))
+   return 1;
+
+   return 0;
+}
+
+/**
  * Runs git-merge, returning its exit status.
  */
 static int run_merge(void)
@@ -475,5 +497,10 @@ int cmd_pull(int argc, const char **argv, const char 
*prefix)
if (!merge_heads.nr)
die_no_merge_candidates(repo, refspecs);
 
-   return run_merge();
+   if (is_null_sha1(orig_head)) {
+   if (merge_heads.nr > 1)
+   die(_("Cannot merge multiple branches into empty 
head."));
+   return pull_into_void(*merge_heads.sha1, curr_head);
+   } else
+   return run_merge();
 }
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html