git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Eric Sunshine" <sunshine@sunshineco.com>,
	"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH v2 14/25] shallow.c: implement a generic shallow boundary finder based on rev-list
Date: Thu,  4 Feb 2016 16:03:50 +0700	[thread overview]
Message-ID: <1454576641-29615-15-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1454576641-29615-1-git-send-email-pclouds@gmail.com>

Instead of a custom commit walker like get_shallow_commits(), this new
function uses rev-list to mark NOT_SHALLOW to all reachable commits,
except borders. The definition of reachable is to be defined by the
protocol later. This makes it more flexible to define shallow boundary.

Note: if a commit has one NOT_SHALLOW parent and one SHALLOW parent,
then it's considered the boundary. Which means in the client side, this
commit has _no_ parents. This could lead to surprising cuts if we're not
careful.

Another option is to include more commits and only mark commits whose
all parents are SHALLOW as boundary.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 commit.h  |  2 ++
 shallow.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)

diff --git a/commit.h b/commit.h
index 5d58be0..b717be1 100644
--- a/commit.h
+++ b/commit.h
@@ -258,6 +258,8 @@ extern int for_each_commit_graft(each_commit_graft_fn, void *);
 extern int is_repository_shallow(void);
 extern struct commit_list *get_shallow_commits(struct object_array *heads,
 		int depth, int shallow_flag, int not_shallow_flag);
+extern struct commit_list *get_shallow_commits_by_rev_list(
+		int ac, const char **av, int shallow_flag, int not_shallow_flag);
 extern void set_alternate_shallow_file(const char *path, int override);
 extern int write_shallow_commits(struct strbuf *out, int use_pack_protocol,
 				 const struct sha1_array *extra);
diff --git a/shallow.c b/shallow.c
index 60f1505..f5d5c1d 100644
--- a/shallow.c
+++ b/shallow.c
@@ -10,6 +10,8 @@
 #include "diff.h"
 #include "revision.h"
 #include "commit-slab.h"
+#include "revision.h"
+#include "list-objects.h"
 
 static int is_shallow = -1;
 static struct stat_validity shallow_stat;
@@ -137,6 +139,89 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth,
 	return result;
 }
 
+static void show_commit(struct commit *commit, void *data)
+{
+	commit->object.flags |= *(int *)data;
+}
+
+/*
+ * Given rev-list arguments, run rev-list. All reachable commits
+ * except border ones are marked with not_shallow_flag. Border commits
+ * are marked with shallow_flag. The list of border/shallow commits
+ * are also returned.
+ */
+struct commit_list *get_shallow_commits_by_rev_list(int ac, const char **av,
+						    int shallow_flag,
+						    int not_shallow_flag)
+{
+	struct commit_list *result = NULL, *p;
+	struct rev_info revs;
+	unsigned int i, nr;
+
+	/*
+	 * SHALLOW (excluded) and NOT_SHALLOW (included) should not be
+	 * set at this point. But better be safe than sorry.
+	 */
+	nr = get_max_object_index();
+	for (i = 0; i < nr; i++) {
+		struct object *o = get_indexed_object(i);
+		if (!o || o->type != OBJ_COMMIT)
+			continue;
+		o->flags &= ~(shallow_flag | not_shallow_flag);
+	}
+
+	is_repository_shallow(); /* make sure shallows are read */
+
+	init_revisions(&revs, NULL);
+	save_commit_buffer = 0;
+	setup_revisions(ac, av, &revs, NULL);
+
+	/* Mark all reachable commits as NOT_SHALLOW */
+	if (prepare_revision_walk(&revs))
+		die("revision walk setup failed");
+	traverse_commit_list(&revs, show_commit, NULL, &not_shallow_flag);
+
+	/*
+	 * mark border commits SHALLOW + NOT_SHALLOW.
+	 * We cannot clear NOT_SHALLOW right now. Imagine border
+	 * commit A is processed first, then commit B, whose parent is
+	 * A, later. If NOT_SHALLOW on A is cleared at step 1, B
+	 * itself is considered border at step 2, which is incorrect.
+	 */
+	nr = get_max_object_index();
+	for (i = 0; i < nr; i++) {
+		struct object *o = get_indexed_object(i);
+		struct commit *c = (struct commit *)o;
+
+		if (!o || o->type != OBJ_COMMIT ||
+		    !(o->flags & not_shallow_flag))
+			continue;
+
+		if (parse_commit(c))
+			die("unable to parse commit %s",
+			    oid_to_hex(&c->object.oid));
+
+		for (p = c->parents; p; p = p->next)
+			if (!(p->item->object.flags & not_shallow_flag)) {
+				o->flags |= shallow_flag;
+				commit_list_insert(c, &result);
+				break;
+			}
+	}
+
+	/*
+	 * Now we can clean up NOT_SHALLOW on border commits. Having
+	 * both flags set can confuse the caller.
+	 */
+	for (p = result; p; p = p->next) {
+		struct object *ro = &p->item->object;
+		if ((ro->flags & not_shallow_flag) &&
+		    (ro->flags & shallow_flag))
+			ro->flags &= ~not_shallow_flag;
+	}
+	return result;
+}
+
 static void check_shallow_file_for_update(void)
 {
 	if (is_shallow == -1)
-- 
2.7.0.377.g4cd97dd

  parent reply	other threads:[~2016-02-04  9:05 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-04  9:03 [PATCH v2 00/25] More flexibility in making shallow clones Nguyễn Thái Ngọc Duy
2016-02-04  9:03 ` [PATCH v2 01/25] remote-curl.c: convert fetch_git() to use argv_array Nguyễn Thái Ngọc Duy
2016-02-04 22:59   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 02/25] transport-helper.c: refactor set_helper_option() Nguyễn Thái Ngọc Duy
2016-02-04 23:18   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 03/25] transport-helper.c: do not send null option to remote helper Nguyễn Thái Ngọc Duy
2016-02-04 23:22   ` Junio C Hamano
2016-02-06  9:38     ` Duy Nguyen
2016-02-08 20:53       ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 04/25] upload-pack: move shallow deepen code out of receive_needs() Nguyễn Thái Ngọc Duy
2016-02-04 23:30   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 05/25] upload-pack: move "shallow" sending code out of deepen() Nguyễn Thái Ngọc Duy
2016-02-04  9:03 ` [PATCH v2 06/25] upload-pack: remove unused variable "backup" Nguyễn Thái Ngọc Duy
2016-02-04 23:32   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 07/25] upload-pack: move "unshallow" sending code out of deepen() Nguyễn Thái Ngọc Duy
2016-02-04 23:39   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 08/25] upload-pack: use skip_prefix() instead of starts_with() when possible Nguyễn Thái Ngọc Duy
2016-02-04 23:42   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 09/25] upload-pack: tighten number parsing at "deepen" lines Nguyễn Thái Ngọc Duy
2016-02-04 23:48   ` Junio C Hamano
2016-02-15  3:07     ` Duy Nguyen
2016-02-04  9:03 ` [PATCH v2 10/25] upload-pack: move rev-list code out of check_non_tip() Nguyễn Thái Ngọc Duy
2016-02-04  9:03 ` [PATCH v2 11/25] fetch-pack: use skip_prefix() instead of starts_with() when possible Nguyễn Thái Ngọc Duy
2016-02-04 23:56   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 12/25] fetch-pack: use a common function for verbose printing Nguyễn Thái Ngọc Duy
2016-02-05  0:02   ` Junio C Hamano
2016-02-05  4:03   ` Eric Sunshine
2016-02-04  9:03 ` [PATCH v2 13/25] fetch-pack: use a separate flag for fetch in deepening mode Nguyễn Thái Ngọc Duy
2016-02-05  0:03   ` Junio C Hamano
2016-02-05  4:13   ` Eric Sunshine
2016-02-04  9:03 ` Nguyễn Thái Ngọc Duy [this message]
2016-02-08 21:09   ` [PATCH v2 14/25] shallow.c: implement a generic shallow boundary finder based on rev-list Junio C Hamano
2016-02-15  8:00     ` Duy Nguyen
2016-02-19  9:30     ` Duy Nguyen
2016-02-04  9:03 ` [PATCH v2 15/25] upload-pack: add deepen-since to cut shallow repos based on time Nguyễn Thái Ngọc Duy
2016-02-08 21:14   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 16/25] fetch: define shallow boundary with --shallow-since Nguyễn Thái Ngọc Duy
2016-02-04  9:03 ` [PATCH v2 17/25] clone: define shallow clone boundary based on time " Nguyễn Thái Ngọc Duy
2016-02-08 21:20   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 18/25] t5500, t5539: tests for shallow depth since a specific date Nguyễn Thái Ngọc Duy
2016-02-08 21:24   ` Junio C Hamano
2016-02-15  7:17     ` Duy Nguyen
2016-02-04  9:03 ` [PATCH v2 19/25] refs: add expand_ref() Nguyễn Thái Ngọc Duy
2016-02-08 21:27   ` Junio C Hamano
2016-02-04  9:03 ` [PATCH v2 20/25] upload-pack: support define shallow boundary by excluding revisions Nguyễn Thái Ngọc Duy
2016-02-05  5:03   ` Eric Sunshine
2016-02-08 21:34     ` Junio C Hamano
2016-02-05  5:05   ` Eric Sunshine
2016-02-15  3:31     ` Duy Nguyen
2016-02-04  9:03 ` [PATCH v2 21/25] fetch: define shallow boundary with --shallow-exclude Nguyễn Thái Ngọc Duy
2016-02-05  5:26   ` Eric Sunshine
2016-02-15  3:53     ` Duy Nguyen
2016-02-15  5:52       ` Eric Sunshine
2016-02-15  5:56         ` Eric Sunshine
2016-02-15  8:15         ` Duy Nguyen
2016-02-19  1:35           ` Eric Sunshine
2016-02-04  9:03 ` [PATCH v2 22/25] clone: define shallow clone " Nguyễn Thái Ngọc Duy
2016-02-04  9:03 ` [PATCH v2 23/25] t5500, t5539: tests for shallow depth excluding a ref Nguyễn Thái Ngọc Duy
2016-02-04  9:04 ` [PATCH v2 24/25] upload-pack: make check_reachable_object() return unreachable list if asked Nguyễn Thái Ngọc Duy
2016-02-05  5:41   ` Eric Sunshine
2016-02-04  9:04 ` [PATCH v2 25/25] fetch, upload-pack: --deepen=N extends shallow boundary by N commits Nguyễn Thái Ngọc Duy
2016-02-08 21:45 ` [PATCH v2 00/25] More flexibility in making shallow clones Junio C Hamano
2016-02-12  0:24   ` Duy Nguyen

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1454576641-29615-15-git-send-email-pclouds@gmail.com \
    --to=pclouds@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=sunshine@sunshineco.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.
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 NNTP newsgroup(s).