Thread (167 messages) 167 messages, 8 authors, 2018-11-09

Re: [GSoC][PATCH v7 15/26] stash: convert create to builtin

From: Thomas Gummerer <hidden>
Date: 2018-08-18 20:23:47

On 08/18, Paul Sebastian Ungureanu wrote:
On Thu, Aug 16, 2018 at 1:13 AM, Thomas Gummerer [off-list ref] wrote:
quoted
On 08/08, Paul-Sebastian Ungureanu wrote:
quoted
 [...]

+                     ret = -1;
+                     goto done;
+             }
+             untracked_commit_option = 1;
+     }
+     if (patch_mode) {
+             ret = stash_patch(info, argv);
+             if (ret < 0) {
+                     printf_ln("Cannot save the current worktree state");
+                     goto done;
+             } else if (ret > 0) {
+                     goto done;
+             }
+     } else {
+             if (stash_working_tree(info, argv)) {
+                     printf_ln("Cannot save the current worktree state");
+                     ret = -1;
+                     goto done;
+             }
+     }
+
+     if (!*stash_msg || !strlen(*stash_msg))
+             strbuf_addf(&final_stash_msg, "WIP on %s", msg.buf);
+     else
+             strbuf_addf(&final_stash_msg, "On %s: %s\n", branch_name,
+                         *stash_msg);
+     *stash_msg = strbuf_detach(&final_stash_msg, NULL);
strbuf_detach means we're taking ownership of the memory, so we'll
have to free it afterwards. Looking at this we may not even want to
re-use the 'stash_msg' variable here, but instead introduce another
variable for it, so it doesn't have a dual meaning in this function.
quoted
+
+     /*
+      * `parents` will be empty after calling `commit_tree()`, so there is
+      * no need to call `free_commit_list()`
+      */
+     parents = NULL;
+     if (untracked_commit_option)
+             commit_list_insert(lookup_commit(the_repository, &info->u_commit), &parents);
+     commit_list_insert(lookup_commit(the_repository, &info->i_commit), &parents);
+     commit_list_insert(head_commit, &parents);
+
+     if (commit_tree(*stash_msg, strlen(*stash_msg), &info->w_tree,
+                     parents, &info->w_commit, NULL, NULL)) {
+             printf_ln("Cannot record working tree state");
+             ret = -1;
+             goto done;
+     }
+
+done:
+     strbuf_release(&commit_tree_label);
+     strbuf_release(&msg);
+     strbuf_release(&out);
+     strbuf_release(&final_stash_msg);
+     return ret;
+}
+
+static int create_stash(int argc, const char **argv, const char *prefix)
+{
+     int include_untracked = 0;
+     int ret = 0;
+     const char *stash_msg = NULL;
+     struct stash_info info;
+     struct option options[] = {
+             OPT_BOOL('u', "include-untracked", &include_untracked,
+                      N_("include untracked files in stash")),
+             OPT_STRING('m', "message", &stash_msg, N_("message"),
+                      N_("stash message")),
+             OPT_END()
+     };
+
+     argc = parse_options(argc, argv, prefix, options,
+                          git_stash_helper_create_usage,
+                          0);
+
+     ret = do_create_stash(argc, argv, prefix, &stash_msg,
+                           include_untracked, 0, &info);
stash_msg doesn't have to be passed as a pointer to a pointer here, as
we never need the modified value after this function returns.  I think
just passing 'stash_msg' here instead of '&stash_msg' will make
'do_create_stash' slightly easier to read.
That's right, but `do_create_stash()` is also called by
`do_push_stash()`, which will need the modified value.
Ah right, I didn't read that far yet when leaving this comment :)

Reading the original push_stash again though, do we actually need the
modified value in 'do_push_stash()'?  The original lines are:

	create_stash -m "$stash_msg" -u "$untracked" -- "$@"
	store_stash -m "$stash_msg" -q $w_commit ||
	die "$(gettext "Cannot save the current status")"

'$stash_msg' gets passed in to 'create_stash()', but is the
'stash_msg' variable inside of 'create_stash()' is local and only the
local copy is modified, so 'store_stash()' would still get the
original.  Or am I missing something?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help