From: Derrick Stolee <dstolee@microsoft.com>
To: "git@vger.kernel.org" <git@vger.kernel.org>
Cc: "sbeller@google.com" <sbeller@google.com>,
"stolee@gmail.com" <stolee@gmail.com>,
"jonathantanmy@google.com" <jonathantanmy@google.com>,
"gitster@pobox.com" <gitster@pobox.com>,
Derrick Stolee <dstolee@microsoft.com>
Subject: [PATCH v2 03/18] commit-reach: move ref_newer from remote.c
Date: Fri, 20 Jul 2018 16:33:06 +0000 [thread overview]
Message-ID: <20180720163227.105950-4-dstolee@microsoft.com> (raw)
In-Reply-To: <20180720163227.105950-1-dstolee@microsoft.com>
There are several commit walks in the codebase. Group them together into
a new commit-reach.c file and corresponding header. After we group these
walks into one place, we can reduce duplicate logic by calling
equivalent methods.
The ref_newer() method is used by 'git push -f' to check if a force-push
is necessary. By making the method public, we make it possible to test
the method directly without setting up an envieronment where a 'git
push' call makes sense.
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
---
builtin/remote.c | 1 +
commit-reach.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++-
commit-reach.h | 2 ++
remote.c | 49 ------------------------------------------
remote.h | 1 -
5 files changed, 57 insertions(+), 51 deletions(-)
diff --git a/builtin/remote.c b/builtin/remote.c
index c74ee88690..79b0326446 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -10,6 +10,7 @@
#include "refspec.h"
#include "object-store.h"
#include "argv-array.h"
+#include "commit-reach.h"
static const char * const builtin_remote_usage[] = {
N_("git remote [-v | --verbose]"),
diff --git a/commit-reach.c b/commit-reach.c
index 8ab6044414..a6bc4781a6 100644
--- a/commit-reach.c
+++ b/commit-reach.c
@@ -1,6 +1,10 @@
#include "cache.h"
-#include "prio-queue.h"
#include "commit.h"
+#include "decorate.h"
+#include "prio-queue.h"
+#include "tree.h"
+#include "revision.h"
+#include "tag.h"
#include "commit-reach.h"
/* Remember to update object flag allocation in object.h */
@@ -358,3 +362,52 @@ void reduce_heads_replace(struct commit_list **heads)
free_commit_list(*heads);
*heads = result;
}
+
+static void unmark_and_free(struct commit_list *list, unsigned int mark)
+{
+ while (list) {
+ struct commit *commit = pop_commit(&list);
+ commit->object.flags &= ~mark;
+ }
+}
+
+int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid)
+{
+ struct object *o;
+ struct commit *old_commit, *new_commit;
+ struct commit_list *list, *used;
+ int found = 0;
+
+ /*
+ * Both new_commit and old_commit must be commit-ish and new_commit is descendant of
+ * old_commit. Otherwise we require --force.
+ */
+ o = deref_tag(the_repository, parse_object(the_repository, old_oid),
+ NULL, 0);
+ if (!o || o->type != OBJ_COMMIT)
+ return 0;
+ old_commit = (struct commit *) o;
+
+ o = deref_tag(the_repository, parse_object(the_repository, new_oid),
+ NULL, 0);
+ if (!o || o->type != OBJ_COMMIT)
+ return 0;
+ new_commit = (struct commit *) o;
+
+ if (parse_commit(new_commit) < 0)
+ return 0;
+
+ used = list = NULL;
+ commit_list_insert(new_commit, &list);
+ while (list) {
+ new_commit = pop_most_recent_commit(&list, TMP_MARK);
+ commit_list_insert(new_commit, &used);
+ if (new_commit == old_commit) {
+ found = 1;
+ break;
+ }
+ }
+ unmark_and_free(list, TMP_MARK);
+ unmark_and_free(used, TMP_MARK);
+ return found;
+}
diff --git a/commit-reach.h b/commit-reach.h
index 1ea2696e40..f1cf9bfcd8 100644
--- a/commit-reach.h
+++ b/commit-reach.h
@@ -39,4 +39,6 @@ struct commit_list *reduce_heads(struct commit_list *heads);
*/
void reduce_heads_replace(struct commit_list **heads);
+int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid);
+
#endif
diff --git a/remote.c b/remote.c
index 8e99b9888a..f0c23bae48 100644
--- a/remote.c
+++ b/remote.c
@@ -1784,55 +1784,6 @@ int resolve_remote_symref(struct ref *ref, struct ref *list)
return 1;
}
-static void unmark_and_free(struct commit_list *list, unsigned int mark)
-{
- while (list) {
- struct commit *commit = pop_commit(&list);
- commit->object.flags &= ~mark;
- }
-}
-
-int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid)
-{
- struct object *o;
- struct commit *old_commit, *new_commit;
- struct commit_list *list, *used;
- int found = 0;
-
- /*
- * Both new_commit and old_commit must be commit-ish and new_commit is descendant of
- * old_commit. Otherwise we require --force.
- */
- o = deref_tag(the_repository, parse_object(the_repository, old_oid),
- NULL, 0);
- if (!o || o->type != OBJ_COMMIT)
- return 0;
- old_commit = (struct commit *) o;
-
- o = deref_tag(the_repository, parse_object(the_repository, new_oid),
- NULL, 0);
- if (!o || o->type != OBJ_COMMIT)
- return 0;
- new_commit = (struct commit *) o;
-
- if (parse_commit(new_commit) < 0)
- return 0;
-
- used = list = NULL;
- commit_list_insert(new_commit, &list);
- while (list) {
- new_commit = pop_most_recent_commit(&list, TMP_MARK);
- commit_list_insert(new_commit, &used);
- if (new_commit == old_commit) {
- found = 1;
- break;
- }
- }
- unmark_and_free(list, TMP_MARK);
- unmark_and_free(used, TMP_MARK);
- return found;
-}
-
/*
* Lookup the upstream branch for the given branch and if present, optionally
* compute the commit ahead/behind values for the pair.
diff --git a/remote.h b/remote.h
index 45ecc6cefa..56fb9cbb27 100644
--- a/remote.h
+++ b/remote.h
@@ -149,7 +149,6 @@ extern struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
const struct string_list *server_options);
int resolve_remote_symref(struct ref *ref, struct ref *list);
-int ref_newer(const struct object_id *new_oid, const struct object_id *old_oid);
/*
* Remove and free all but the first of any entries in the input list
--
2.18.0.118.gd4f65b8d14
next prev parent reply other threads:[~2018-07-20 16:33 UTC|newest]
Thread overview: 118+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-16 13:00 [PATCH 00/16] Consolidate reachability logic Derrick Stolee via GitGitGadget
2018-06-19 20:25 ` [PATCH 04/16] upload-pack: make reachable() more generic Derrick Stolee via GitGitGadget
2018-06-19 20:35 ` [PATCH 05/16] upload-pack: refactor ok_to_give_up() Derrick Stolee via GitGitGadget
2018-06-25 17:16 ` [PATCH 01/16] commit-reach: move walk methods from commit.c Derrick Stolee via GitGitGadget
2018-07-16 18:57 ` Stefan Beller
2018-07-16 21:31 ` Jonathan Tan
2018-06-25 17:35 ` [PATCH 02/16] commit-reach: move ref_newer from remote.c Derrick Stolee via GitGitGadget
2018-07-16 19:10 ` Stefan Beller
2018-06-25 18:01 ` [PATCH 03/16] commit-reach: move commit_contains from ref-filter Derrick Stolee via GitGitGadget
2018-07-16 19:14 ` Stefan Beller
2018-06-28 12:31 ` [PATCH 15/16] commit-reach: make can_all_from_reach... linear Derrick Stolee via GitGitGadget
2018-07-16 22:37 ` Stefan Beller
2018-07-17 1:16 ` Jonathan Tan
2018-10-01 19:16 ` René Scharfe
2018-10-01 19:26 ` Derrick Stolee
2018-10-01 20:37 ` René Scharfe
2018-10-04 22:59 ` René Scharfe
2018-10-05 12:15 ` Derrick Stolee
2018-10-05 16:51 ` Jeff King
2018-10-05 18:48 ` René Scharfe
2018-10-05 19:08 ` Jeff King
2018-10-05 19:36 ` René Scharfe
2018-10-05 19:42 ` Jeff King
2018-10-14 14:29 ` René Scharfe
2018-10-15 15:31 ` Derrick Stolee
2018-10-15 16:26 ` René Scharfe
2018-10-16 23:09 ` Junio C Hamano
2018-10-17 8:33 ` Jeff King
2020-11-18 2:16 ` Jonathan Nieder
2020-11-18 6:54 ` Jeff King
2020-11-18 17:47 ` René Scharfe
2018-10-05 19:12 ` Ævar Arnfjörð Bjarmason
2018-10-05 19:28 ` Jeff King
2018-10-05 19:42 ` Ævar Arnfjörð Bjarmason
2018-10-05 19:44 ` Jeff King
2018-07-12 20:47 ` [PATCH 06/16] upload-pack: generalize commit date cutoff Derrick Stolee via GitGitGadget
2018-07-16 19:38 ` Stefan Beller
2018-07-18 16:04 ` Derrick Stolee
2018-07-12 20:52 ` [PATCH 07/16] commit-reach: move can_all_from_reach_with_flags Derrick Stolee via GitGitGadget
2018-07-16 22:37 ` Jonathan Tan
2018-07-13 14:06 ` [PATCH 08/16] test-reach: create new test tool for ref_newer Derrick Stolee via GitGitGadget
2018-07-16 23:00 ` Jonathan Tan
2018-07-18 16:14 ` Derrick Stolee
2018-07-13 14:28 ` [PATCH 09/16] test-reach: test in_merge_bases Derrick Stolee via GitGitGadget
2018-07-13 14:38 ` [PATCH 10/16] test-reach: test is_descendant_of Derrick Stolee via GitGitGadget
2018-07-13 14:51 ` [PATCH 11/16] test-reach: test get_merge_bases_many Derrick Stolee via GitGitGadget
2018-07-16 21:24 ` Stefan Beller
2018-07-16 23:08 ` Jonathan Tan
2018-07-13 16:51 ` [PATCH 12/16] test-reach: test reduce_heads Derrick Stolee via GitGitGadget
2018-07-16 21:30 ` Stefan Beller
2018-07-16 21:59 ` Eric Sunshine
2018-07-13 17:22 ` [PATCH 13/16] test-reach: test can_all_from_reach_with_flags Derrick Stolee via GitGitGadget
2018-07-16 21:54 ` Stefan Beller
2018-07-18 16:54 ` Derrick Stolee
2018-07-17 0:10 ` Jonathan Tan
2018-07-13 18:37 ` [PATCH 14/16] commit-reach: replace ref_newer logic Derrick Stolee via GitGitGadget
2018-07-16 22:16 ` Stefan Beller
2018-07-13 19:25 ` [PATCH 16/16] commit-reach: use can_all_from_reach Derrick Stolee via GitGitGadget
2018-07-16 22:47 ` Stefan Beller
2018-07-16 13:54 ` [PATCH 00/16] Consolidate reachability logic Ramsay Jones
2018-07-16 16:18 ` Jeff King
2018-07-16 18:40 ` Eric Sunshine
2018-07-16 18:56 ` Jeff King
2018-07-16 18:59 ` Eric Sunshine
2018-07-18 12:32 ` Johannes Schindelin
2018-07-18 12:23 ` Johannes Schindelin
2018-07-18 19:21 ` Jeff King
2018-07-19 16:34 ` Johannes Schindelin
2018-07-16 17:26 ` Stefan Beller
2018-07-16 18:44 ` Eric Sunshine
2018-07-16 18:47 ` Derrick Stolee
2018-07-18 12:28 ` Johannes Schindelin
2018-07-18 15:01 ` Duy Nguyen
2018-07-18 17:01 ` Junio C Hamano
2018-07-18 17:11 ` Derrick Stolee
2018-07-19 16:37 ` Johannes Schindelin
2018-07-19 16:32 ` Johannes Schindelin
2018-07-20 16:33 ` [PATCH v2 00/18] " Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 01/18] commit-reach: move walk methods from commit.c Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 02/18] commit.h: remove method declarations Derrick Stolee
2018-07-20 16:33 ` Derrick Stolee [this message]
2018-07-20 16:33 ` [PATCH v2 04/18] commit-reach: move commit_contains from ref-filter Derrick Stolee
2018-08-28 21:24 ` Jonathan Nieder
2018-08-28 21:33 ` Derrick Stolee
2018-08-28 21:36 ` [PATCH] commit-reach: correct accidental #include of C file Jonathan Nieder
2018-08-28 21:39 ` Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 05/18] upload-pack: make reachable() more generic Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 06/18] upload-pack: refactor ok_to_give_up() Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 07/18] upload-pack: generalize commit date cutoff Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 08/18] commit-reach: move can_all_from_reach_with_flags Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 09/18] test-reach: create new test tool for ref_newer Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 10/18] test-reach: test in_merge_bases Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 11/18] test-reach: test is_descendant_of Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 12/18] test-reach: test get_merge_bases_many Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 13/18] test-reach: test reduce_heads Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 14/18] test-reach: test can_all_from_reach_with_flags Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 15/18] test-reach: test commit_contains Derrick Stolee
2018-07-23 20:35 ` Jonathan Tan
2018-07-25 18:08 ` Junio C Hamano
2018-07-25 18:30 ` Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 16/18] commit-reach: replace ref_newer logic Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 17/18] commit-reach: make can_all_from_reach... linear Derrick Stolee
2018-07-23 20:41 ` Jonathan Tan
2018-08-01 20:41 ` Derrick Stolee
2018-09-12 4:14 ` Jeff King
2018-09-12 4:29 ` Jeff King
2018-09-12 13:08 ` Derrick Stolee
2018-07-20 16:33 ` [PATCH v2 18/18] commit-reach: use can_all_from_reach Derrick Stolee
2018-07-20 17:10 ` [PATCH v2 00/18] Consolidate reachability logic Stefan Beller
2018-07-20 17:15 ` Derrick Stolee
2018-07-20 22:16 ` Stefan Beller
2018-08-01 20:33 ` Derrick Stolee
2018-07-20 17:18 ` Derrick Stolee
2018-07-20 18:09 ` Eric Sunshine
2018-07-20 19:14 ` Derrick Stolee
2018-07-20 17:41 ` Duy Nguyen
2018-07-20 19:09 ` Derrick Stolee
2018-07-20 22:45 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180720163227.105950-4-dstolee@microsoft.com \
--to=dstolee@microsoft.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jonathantanmy@google.com \
--cc=sbeller@google.com \
--cc=stolee@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).