]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'dl/merge-autostash'
authorJunio C Hamano <gitster@pobox.com>
Wed, 29 Apr 2020 23:15:27 +0000 (16:15 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 29 Apr 2020 23:15:27 +0000 (16:15 -0700)
"git merge" learns the "--autostash" option.

* dl/merge-autostash: (22 commits)
  pull: pass --autostash to merge
  t5520: make test_pull_autostash() accept expect_parent_num
  merge: teach --autostash option
  sequencer: implement apply_autostash_oid()
  sequencer: implement save_autostash()
  sequencer: unlink autostash in apply_autostash()
  sequencer: extract perform_autostash() from rebase
  rebase: generify create_autostash()
  rebase: extract create_autostash()
  reset: extract reset_head() from rebase
  rebase: generify reset_head()
  rebase: use apply_autostash() from sequencer.c
  sequencer: rename stash_sha1 to stash_oid
  sequencer: make apply_autostash() accept a path
  rebase: use read_oneliner()
  sequencer: make read_oneliner() extern
  sequencer: configurably warn on non-existent files
  sequencer: make read_oneliner() accept flags
  sequencer: make file exists check more efficient
  sequencer: stop leaking buf
  ...

1  2 
Documentation/git-pull.txt
Documentation/merge-options.txt
Makefile
builtin/commit.c
builtin/merge.c
builtin/pull.c
builtin/rebase.c
path.c
reset.c
sequencer.c
sequencer.h

Simple merge
Simple merge
diff --cc Makefile
index 6e3b3c22a82519ff85683d013a5746382c7c0bc2,338fb55b7377367c6ed27ba79cf49bf9b3930f8d..a16f4f53efc6c848c106f7fb10dacd9add0a67bc
+++ b/Makefile
@@@ -712,6 -718,6 +712,7 @@@ TEST_BUILTINS_OBJS += test-lazy-init-na
  TEST_BUILTINS_OBJS += test-match-trees.o
  TEST_BUILTINS_OBJS += test-mergesort.o
  TEST_BUILTINS_OBJS += test-mktemp.o
++TEST_BUILTINS_OBJS += test-oid-array.o
  TEST_BUILTINS_OBJS += test-oidmap.o
  TEST_BUILTINS_OBJS += test-online-cpus.o
  TEST_BUILTINS_OBJS += test-parse-options.o
@@@ -731,8 -737,8 +732,7 @@@ TEST_BUILTINS_OBJS += test-revision-wal
  TEST_BUILTINS_OBJS += test-run-command.o
  TEST_BUILTINS_OBJS += test-scrap-cache-tree.o
  TEST_BUILTINS_OBJS += test-serve-v2.o
 -TEST_BUILTINS_OBJS += test-sha1-array.o
  TEST_BUILTINS_OBJS += test-sha1.o
- TEST_BUILTINS_OBJS += test-oid-array.o
  TEST_BUILTINS_OBJS += test-sha256.o
  TEST_BUILTINS_OBJS += test-sigchain.o
  TEST_BUILTINS_OBJS += test-strcmp-offset.o
@@@ -920,14 -925,12 +920,13 @@@ LIB_OBJS += negotiator/skipping.
  LIB_OBJS += notes-cache.o
  LIB_OBJS += notes-merge.o
  LIB_OBJS += notes-utils.o
+ LIB_OBJS += notes.o
  LIB_OBJS += object.o
++LIB_OBJS += oid-array.o
  LIB_OBJS += oidmap.o
  LIB_OBJS += oidset.o
- LIB_OBJS += oid-array.o
- LIB_OBJS += packfile.o
- LIB_OBJS += pack-bitmap.o
  LIB_OBJS += pack-bitmap-write.o
+ LIB_OBJS += pack-bitmap.o
  LIB_OBJS += pack-check.o
  LIB_OBJS += pack-objects.o
  LIB_OBJS += pack-revindex.o
@@@ -975,8 -979,9 +976,8 @@@ LIB_OBJS += sequencer.
  LIB_OBJS += serve.o
  LIB_OBJS += server-info.o
  LIB_OBJS += setup.o
- LIB_OBJS += sha1-lookup.o
 -LIB_OBJS += sha1-array.o
  LIB_OBJS += sha1-file.o
+ LIB_OBJS += sha1-lookup.o
  LIB_OBJS += sha1-name.o
  LIB_OBJS += shallow.o
  LIB_OBJS += sideband.o
Simple merge
diff --cc builtin/merge.c
Simple merge
diff --cc builtin/pull.c
Simple merge
Simple merge
diff --cc path.c
Simple merge
diff --cc reset.c
index 0000000000000000000000000000000000000000,79b683bffa77e7122849c3b7918042761d02f96a..2f4fbd07c54b59f71c92391a601d1ec9fe05ce7d
mode 000000,100644..100644
--- /dev/null
+++ b/reset.c
@@@ -1,0 -1,140 +1,141 @@@
+ #include "git-compat-util.h"
+ #include "cache-tree.h"
+ #include "lockfile.h"
+ #include "refs.h"
+ #include "reset.h"
+ #include "run-command.h"
+ #include "tree-walk.h"
+ #include "tree.h"
+ #include "unpack-trees.h"
+ int reset_head(struct repository *r, struct object_id *oid, const char *action,
+              const char *switch_to_branch, unsigned flags,
+              const char *reflog_orig_head, const char *reflog_head,
+              const char *default_reflog_action)
+ {
+       unsigned detach_head = flags & RESET_HEAD_DETACH;
+       unsigned reset_hard = flags & RESET_HEAD_HARD;
+       unsigned run_hook = flags & RESET_HEAD_RUN_POST_CHECKOUT_HOOK;
+       unsigned refs_only = flags & RESET_HEAD_REFS_ONLY;
+       unsigned update_orig_head = flags & RESET_ORIG_HEAD;
+       struct object_id head_oid;
+       struct tree_desc desc[2] = { { NULL }, { NULL } };
+       struct lock_file lock = LOCK_INIT;
+       struct unpack_trees_options unpack_tree_opts;
+       struct tree *tree;
+       const char *reflog_action;
+       struct strbuf msg = STRBUF_INIT;
+       size_t prefix_len;
+       struct object_id *orig = NULL, oid_orig,
+               *old_orig = NULL, oid_old_orig;
+       int ret = 0, nr = 0;
+       if (switch_to_branch && !starts_with(switch_to_branch, "refs/"))
+               BUG("Not a fully qualified branch: '%s'", switch_to_branch);
+       if (!refs_only && repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) {
+               ret = -1;
+               goto leave_reset_head;
+       }
+       if ((!oid || !reset_hard) && get_oid("HEAD", &head_oid)) {
+               ret = error(_("could not determine HEAD revision"));
+               goto leave_reset_head;
+       }
+       if (!oid)
+               oid = &head_oid;
+       if (refs_only)
+               goto reset_head_refs;
+       memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
+       setup_unpack_trees_porcelain(&unpack_tree_opts, action);
+       unpack_tree_opts.head_idx = 1;
+       unpack_tree_opts.src_index = r->index;
+       unpack_tree_opts.dst_index = r->index;
+       unpack_tree_opts.fn = reset_hard ? oneway_merge : twoway_merge;
+       unpack_tree_opts.update = 1;
+       unpack_tree_opts.merge = 1;
++      init_checkout_metadata(&unpack_tree_opts.meta, switch_to_branch, oid, NULL);
+       if (!detach_head)
+               unpack_tree_opts.reset = 1;
+       if (repo_read_index_unmerged(r) < 0) {
+               ret = error(_("could not read index"));
+               goto leave_reset_head;
+       }
+       if (!reset_hard && !fill_tree_descriptor(r, &desc[nr++], &head_oid)) {
+               ret = error(_("failed to find tree of %s"),
+                           oid_to_hex(&head_oid));
+               goto leave_reset_head;
+       }
+       if (!fill_tree_descriptor(r, &desc[nr++], oid)) {
+               ret = error(_("failed to find tree of %s"), oid_to_hex(oid));
+               goto leave_reset_head;
+       }
+       if (unpack_trees(nr, desc, &unpack_tree_opts)) {
+               ret = -1;
+               goto leave_reset_head;
+       }
+       tree = parse_tree_indirect(oid);
+       prime_cache_tree(r, r->index, tree);
+       if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0) {
+               ret = error(_("could not write index"));
+               goto leave_reset_head;
+       }
+ reset_head_refs:
+       reflog_action = getenv(GIT_REFLOG_ACTION_ENVIRONMENT);
+       strbuf_addf(&msg, "%s: ", reflog_action ? reflog_action : default_reflog_action);
+       prefix_len = msg.len;
+       if (update_orig_head) {
+               if (!get_oid("ORIG_HEAD", &oid_old_orig))
+                       old_orig = &oid_old_orig;
+               if (!get_oid("HEAD", &oid_orig)) {
+                       orig = &oid_orig;
+                       if (!reflog_orig_head) {
+                               strbuf_addstr(&msg, "updating ORIG_HEAD");
+                               reflog_orig_head = msg.buf;
+                       }
+                       update_ref(reflog_orig_head, "ORIG_HEAD", orig,
+                                  old_orig, 0, UPDATE_REFS_MSG_ON_ERR);
+               } else if (old_orig)
+                       delete_ref(NULL, "ORIG_HEAD", old_orig, 0);
+       }
+       if (!reflog_head) {
+               strbuf_setlen(&msg, prefix_len);
+               strbuf_addstr(&msg, "updating HEAD");
+               reflog_head = msg.buf;
+       }
+       if (!switch_to_branch)
+               ret = update_ref(reflog_head, "HEAD", oid, orig,
+                                detach_head ? REF_NO_DEREF : 0,
+                                UPDATE_REFS_MSG_ON_ERR);
+       else {
+               ret = update_ref(reflog_head, switch_to_branch, oid,
+                                NULL, 0, UPDATE_REFS_MSG_ON_ERR);
+               if (!ret)
+                       ret = create_symref("HEAD", switch_to_branch,
+                                           reflog_head);
+       }
+       if (run_hook)
+               run_hook_le(NULL, "post-checkout",
+                           oid_to_hex(orig ? orig : &null_oid),
+                           oid_to_hex(oid), "1", NULL);
+ leave_reset_head:
+       strbuf_release(&msg);
+       rollback_lock_file(&lock);
+       while (nr)
+               free((void *)desc[--nr].buffer);
+       return ret;
+ }
diff --cc sequencer.c
Simple merge
diff --cc sequencer.h
Simple merge