From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: philipoakley@iee.org
Cc: git@vger.kernel.org, "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 5/6] shallow.c: implement a generic shallow boundary finder based on rev-list
Date: Thu, 5 Mar 2015 17:28:14 +0700 [thread overview]
Message-ID: <1425551295-28653-6-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1425551295-28653-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 SHALLOW to all reachable commits. 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 not-shallow as boundary.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
commit.h | 2 ++
shallow.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 67 insertions(+)
diff --git a/commit.h b/commit.h
index 9f189cb..5c80eea 100644
--- a/commit.h
+++ b/commit.h
@@ -254,6 +254,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 d8bf40a..1db2768 100644
--- a/shallow.c
+++ b/shallow.c
@@ -10,6 +10,8 @@
#include "revision.h"
#include "commit-slab.h"
#include "sigchain.h"
+#include "revision.h"
+#include "list-objects.h"
static int is_shallow = -1;
static struct stat_validity shallow_stat;
@@ -137,6 +139,69 @@ 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;
+}
+
+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;
+ struct rev_info revs;
+ unsigned int i, nr;
+
+ /*
+ * SHALLOW and NOT_SHALLOW 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);
+ 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 SHALLOW */
+ if (prepare_revision_walk(&revs))
+ die("revision walk setup failed");
+ traverse_commit_list(&revs, show_commit, NULL, &shallow_flag);
+
+ nr = get_max_object_index();
+ for (i = 0; i < nr; i++) {
+ struct object *o = get_indexed_object(i);
+ struct commit *c = (struct commit *)o;
+ struct commit_list *p;
+ int parent_is_not_shallow = 0;
+
+ if (o->type != OBJ_COMMIT || !(o->flags & shallow_flag))
+ continue;
+
+ if (parse_commit(c))
+ die("unable to parse commit %s",
+ sha1_to_hex(c->object.sha1));
+
+ for (p = c->parents; p; p = p->next) {
+ if (p->item->object.flags & shallow_flag)
+ continue;
+ parent_is_not_shallow = 1;
+ if (p->item->object.flags & not_shallow_flag)
+ continue;
+ p->item->object.flags |= not_shallow_flag;
+ commit_list_insert(p->item, &result);
+ }
+
+ if (parent_is_not_shallow)
+ commit_list_insert(c, &result);
+ }
+ return result;
+}
+
static void check_shallow_file_for_update(void)
{
if (is_shallow == -1)
--
2.3.0.rc1.137.g477eb31
next prev parent reply other threads:[~2015-03-05 10:29 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-18 19:14 [RFH] GSoC 2015 application Jeff King
2015-02-18 19:32 ` Jeff King
2015-02-24 12:01 ` Johannes Schindelin
2015-02-24 12:06 ` [msysGit] " Jeff King
2015-02-24 12:25 ` Johannes Schindelin
2015-02-24 12:28 ` [msysGit] " Jeff King
2015-02-25 9:25 ` Johannes Schindelin
2015-02-25 9:39 ` Matthieu Moy
2015-02-25 10:25 ` Matthieu Moy
2015-02-25 12:15 ` Johannes Schindelin
2015-02-24 17:32 ` Matthieu Moy
2015-02-24 18:25 ` Junio C Hamano
2015-02-24 20:33 ` Johannes Schindelin
2015-02-24 21:02 ` Junio C Hamano
2015-02-24 23:56 ` Matthieu Moy
2015-02-25 0:34 ` [msysGit] " Stefan Beller
2015-02-25 9:25 ` Michael J Gruber
2015-02-25 8:44 ` Johannes Schindelin
2015-02-25 10:04 ` [msysGit] " Christian Couder
2015-02-25 10:02 ` Duy Nguyen
2015-02-25 12:10 ` Johannes Schindelin
2015-02-18 21:54 ` Junio C Hamano
2015-02-19 5:49 ` Junio C Hamano
2015-02-19 10:32 ` Matthieu Moy
2015-02-20 2:00 ` Jeff King
2015-02-20 10:06 ` Matthieu Moy
2015-02-20 10:22 ` Dennis Kaarsemaker
2015-02-20 10:34 ` Matthieu Moy
2015-02-20 23:06 ` Eric Sunshine
2015-02-20 10:31 ` [PATCH 1/3] microprojects: tweaks after discussion with Peff Matthieu Moy
2015-02-20 10:31 ` [PATCH 2/3] GSoC ideas: git bisect fixed/unfixed Matthieu Moy
2015-02-20 10:31 ` [PATCH 3/3] idea: Be nicer to the user on tracked/untracked merge conflicts Matthieu Moy
2015-02-20 3:26 ` [RFH] GSoC 2015 application Duy Nguyen
2015-02-20 7:13 ` Jeff King
2015-02-20 8:26 ` Junio C Hamano
2015-02-21 3:02 ` Support customized reordering in version sort Duy Nguyen
2015-02-21 3:25 ` Junio C Hamano
2015-02-21 3:33 ` Duy Nguyen
2015-02-21 5:12 ` Junio C Hamano
2015-02-21 5:37 ` Junio C Hamano
2015-02-26 10:44 ` [PATCH] versionsort: support reorder prerelease suffixes Nguyễn Thái Ngọc Duy
2015-02-27 21:37 ` Junio C Hamano
2015-03-05 1:28 ` Junio C Hamano
2015-03-09 1:01 ` Duy Nguyen
2015-03-10 7:52 ` Junio C Hamano
2015-03-10 8:03 ` Eric Sunshine
2015-03-10 10:16 ` [PATCH] config.txt: update versioncmp.prereleaseSuffix Nguyễn Thái Ngọc Duy
2015-02-20 5:35 ` [RFH] GSoC 2015 application Michael Haggerty
2015-02-20 7:29 ` Jeff King
2015-02-20 8:06 ` Junio C Hamano
2015-02-20 9:39 ` Matthieu Moy
2015-02-20 9:48 ` Jeff King
2015-02-20 11:35 ` Jeff King
2015-02-23 8:02 ` Matthieu Moy
2015-02-23 15:36 ` Jeff King
2015-03-04 22:05 ` Philip Oakley
2015-03-04 23:55 ` Stefan Beller
2015-03-05 0:17 ` Philip Oakley
2015-03-05 0:22 ` Junio C Hamano
2015-03-05 0:32 ` Stefan Beller
2015-03-05 1:17 ` Junio C Hamano
2015-03-05 6:19 ` Junio C Hamano
2015-03-06 11:24 ` Duy Nguyen
2015-03-05 0:26 ` Duy Nguyen
2015-03-05 10:28 ` Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 1/6] upload-pack: move shallow deepen code out of receive_needs() Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 2/6] upload-pack: move "shallow" sending code out of deepen() Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 3/6] upload-pack: remove unused variable "backup" Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 4/6] upload-pack: move "unshallow" sending code out of deepen() Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` Nguyễn Thái Ngọc Duy [this message]
2015-03-05 10:28 ` [PATCH 6/6] upload-pack: example code to use get_shallow_commits_by_rev_list Nguyễn Thái Ngọc Duy
2015-02-26 13:10 ` [RFH] GSoC 2015 application Duy Nguyen
2015-03-04 10:31 ` Jeff King
2015-03-04 11:21 ` 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
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=1425551295-28653-6-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=philipoakley@iee.org \
/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).