From: Ramkumar Ramachandra <artagnon@gmail.com>
To: Git List <git@vger.kernel.org>
Cc: Junio C Hamano <gitster@pobox.com>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: [PATCH 1/7] link.c, link.h: introduce fifth object type
Date: Fri, 5 Apr 2013 00:00:37 +0530 [thread overview]
Message-ID: <1365100243-13676-2-git-send-email-artagnon@gmail.com> (raw)
In-Reply-To: <1365100243-13676-1-git-send-email-artagnon@gmail.com>
Submodules suffer from one major design flaw: they are represented as
commit objects in the tree. There are several problems with this:
1. Since the object is actually part of the submodule's object
store (you can't even cat-file the commit), the superproject knows
very little about the submodule. We currently work around this by
having an ugly .gitmodules file in the toplevel directory mapping
upstream URLs to submodule paths.
2. We are restricted to having a concrete SHA-1 to convey what the
subproject's HEAD should point to. As a result, it is impossible
to have true floating submodules.
3. It is impossible to initialize a nested submodule without
initializing the containing submodule first. This is a consequence
of our .gitmodules hack, and we should really fix it.
4. Always stat'ing all subproject worktrees can be problematic if
there are very large subprojects; we should be able to turn it off
for some submodules selectively. A good future direction would be
to add more submodule-specific properties, instead of assuming that
all submodules are equal. Stuffing more properties into
.gitmodules is really not a solution.
5. Finally, the git-submodule shell script has lots of horrible warts
(like cd-to-toplevel for any operation) that are non-trivial to
fix, and introduces a very unnatural layer of abstraction.
There are various specialized tools like mr, repo, gitslave, and
git-subtree, which offer different compositions solving some problems
while introducing limitations of their own.
We propose to fix the problem for good. More specifically, introduce
a new object type corresponding to mode 16000 (gitlink). This new
object will convey all the required information about the individual
submodules to the superproject. Rework git core to get rid of
.gitmodules and git-submodule altogether.
This patch doesn't do anything by itself: although it is possible to
create link objects using 'git hash-object -t link',
parse_link_buffer() is unimplemented. In future patches, we intend to
flesh out how core git will handle this object.
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
---
Makefile | 2 ++
alloc.c | 3 +++
cache.h | 3 ++-
link.c | 27 +++++++++++++++++++++++++++
link.h | 26 ++++++++++++++++++++++++++
object.c | 9 +++++++++
6 files changed, 69 insertions(+), 1 deletion(-)
create mode 100644 link.c
create mode 100644 link.h
diff --git a/Makefile b/Makefile
index 0f931a2..cd4b6f9 100644
--- a/Makefile
+++ b/Makefile
@@ -673,6 +673,7 @@ LIB_H += help.h
LIB_H += http.h
LIB_H += kwset.h
LIB_H += levenshtein.h
+LIB_H += link.h
LIB_H += list-objects.h
LIB_H += ll-merge.h
LIB_H += log-tree.h
@@ -801,6 +802,7 @@ LIB_OBJS += hex.o
LIB_OBJS += ident.o
LIB_OBJS += kwset.o
LIB_OBJS += levenshtein.o
+LIB_OBJS += link.o
LIB_OBJS += list-objects.o
LIB_OBJS += ll-merge.o
LIB_OBJS += lockfile.o
diff --git a/alloc.c b/alloc.c
index aeae55c..1445879 100644
--- a/alloc.c
+++ b/alloc.c
@@ -15,6 +15,7 @@
#include "tree.h"
#include "commit.h"
#include "tag.h"
+#include "link.h"
#define BLOCKING 1024
@@ -49,6 +50,7 @@ DEFINE_ALLOCATOR(blob, struct blob)
DEFINE_ALLOCATOR(tree, struct tree)
DEFINE_ALLOCATOR(commit, struct commit)
DEFINE_ALLOCATOR(tag, struct tag)
+DEFINE_ALLOCATOR(link, struct link)
DEFINE_ALLOCATOR(object, union any_object)
static void report(const char *name, unsigned int count, size_t size)
@@ -66,4 +68,5 @@ void alloc_report(void)
REPORT(tree);
REPORT(commit);
REPORT(tag);
+ REPORT(link);
}
diff --git a/cache.h b/cache.h
index ec2fd7a..ca0583f 100644
--- a/cache.h
+++ b/cache.h
@@ -317,7 +317,7 @@ enum object_type {
OBJ_TREE = 2,
OBJ_BLOB = 3,
OBJ_TAG = 4,
- /* 5 for future expansion */
+ OBJ_LINK = 5,
OBJ_OFS_DELTA = 6,
OBJ_REF_DELTA = 7,
OBJ_ANY,
@@ -1241,6 +1241,7 @@ extern void *alloc_blob_node(void);
extern void *alloc_tree_node(void);
extern void *alloc_commit_node(void);
extern void *alloc_tag_node(void);
+extern void *alloc_link_node(void);
extern void *alloc_object_node(void);
extern void alloc_report(void);
diff --git a/link.c b/link.c
new file mode 100644
index 0000000..bb20a51
--- /dev/null
+++ b/link.c
@@ -0,0 +1,27 @@
+#include "cache.h"
+#include "link.h"
+
+const char *link_type = "link";
+
+struct link *lookup_link(const unsigned char *sha1)
+{
+ struct object *obj = lookup_object(sha1);
+ if (!obj)
+ return create_object(sha1, OBJ_LINK, alloc_link_node());
+ if (!obj->type)
+ obj->type = OBJ_LINK;
+ if (obj->type != OBJ_LINK) {
+ error("Object %s is a %s, not a link",
+ sha1_to_hex(sha1), typename(obj->type));
+ return NULL;
+ }
+ return (struct link *) obj;
+}
+
+int parse_link_buffer(struct link *item, void *buffer, unsigned long size)
+{
+ if (item->object.parsed)
+ return 0;
+ item->object.parsed = 1;
+ return 0;
+}
diff --git a/link.h b/link.h
new file mode 100644
index 0000000..64dd19d
--- /dev/null
+++ b/link.h
@@ -0,0 +1,26 @@
+#ifndef LINK_H
+#define LINK_H
+
+#include "object.h"
+
+extern const char *link_type;
+
+struct link {
+ struct object object;
+ const char *upstream_url;
+ const char *checkout_rev;
+ const char *ref_name;
+ unsigned int floating:1;
+ unsigned int statthrough:1;
+};
+
+struct link *lookup_link(const unsigned char *sha1);
+
+int parse_link_buffer(struct link *item, void *buffer, unsigned long size);
+
+/**
+ * Links do not contain references to other objects, but have
+ * structured data that needs parsing.
+ **/
+
+#endif /* LINK_H */
diff --git a/object.c b/object.c
index 20703f5..d3674ea 100644
--- a/object.c
+++ b/object.c
@@ -4,6 +4,7 @@
#include "tree.h"
#include "commit.h"
#include "tag.h"
+#include "link.h"
static struct object **obj_hash;
static int nr_objs, obj_hash_size;
@@ -24,6 +25,7 @@ static const char *object_type_strings[] = {
"tree", /* OBJ_TREE = 2 */
"blob", /* OBJ_BLOB = 3 */
"tag", /* OBJ_TAG = 4 */
+ "link", /* OBJ_LINK = 5 */
};
const char *typename(unsigned int type)
@@ -175,6 +177,13 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
return NULL;
obj = &tag->object;
}
+ } else if (type == OBJ_LINK) {
+ struct link *link = lookup_link(sha1);
+ if (link) {
+ if (parse_link_buffer(link, buffer, size))
+ return NULL;
+ obj = &link->object;
+ }
} else {
warning("object %s has unknown type id %d", sha1_to_hex(sha1), type);
obj = NULL;
--
1.8.2.380.g0d4e79b
next prev parent reply other threads:[~2013-04-04 18:29 UTC|newest]
Thread overview: 140+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-04 18:30 [RFC/PATCH 0/7] Rework git core for native submodules Ramkumar Ramachandra
2013-04-04 18:30 ` Ramkumar Ramachandra [this message]
2013-04-04 18:30 ` [PATCH 2/7] sha1_file, link: write link objects to the database Ramkumar Ramachandra
2013-04-05 7:11 ` Ramkumar Ramachandra
2013-04-05 7:59 ` Ramkumar Ramachandra
2013-04-04 18:30 ` [PATCH 3/7] teach ce_compare_gitlink() about OBJ_LINK Ramkumar Ramachandra
2013-04-04 18:30 ` [PATCH 4/7] builtin/log: teach show " Ramkumar Ramachandra
2013-04-04 18:30 ` [PATCH 5/7] edit-link: add new builtin Ramkumar Ramachandra
2013-04-04 18:30 ` [PATCH 6/7] clone: introduce clone.submodulegitdir Ramkumar Ramachandra
2013-04-05 7:07 ` Ramkumar Ramachandra
2013-04-04 18:30 ` [PATCH 7/7] sha1_file: write ref_name to link object Ramkumar Ramachandra
2013-04-05 7:03 ` Ramkumar Ramachandra
2013-04-04 18:40 ` [RFC/PATCH 0/7] Rework git core for native submodules Linus Torvalds
2013-04-04 18:52 ` Ramkumar Ramachandra
2013-04-04 19:04 ` Linus Torvalds
2013-04-04 19:17 ` Junio C Hamano
2013-04-04 19:59 ` Ramkumar Ramachandra
2013-04-04 20:28 ` Jens Lehmann
2013-04-04 19:36 ` Ramkumar Ramachandra
2013-04-04 19:44 ` Linus Torvalds
2013-04-04 19:52 ` Ramkumar Ramachandra
2013-04-04 20:08 ` Ramkumar Ramachandra
2013-04-04 20:04 ` Ramkumar Ramachandra
2013-04-05 16:02 ` Linus Torvalds
2013-04-05 16:37 ` Ramkumar Ramachandra
2013-04-04 19:42 ` Ramkumar Ramachandra
2013-04-04 21:20 ` Jens Lehmann
2013-04-04 21:35 ` Ramkumar Ramachandra
2013-04-04 22:13 ` Junio C Hamano
2013-04-04 22:18 ` Ramkumar Ramachandra
2013-04-04 22:26 ` Junio C Hamano
2013-04-04 22:32 ` Ramkumar Ramachandra
2013-04-04 23:08 ` Junio C Hamano
2013-04-04 23:14 ` Ramkumar Ramachandra
2013-04-05 17:07 ` Junio C Hamano
2013-04-05 17:23 ` Ramkumar Ramachandra
2013-04-05 6:53 ` Ramkumar Ramachandra
2013-04-04 18:47 ` Jonathan Nieder
2013-04-04 18:58 ` Jonathan Nieder
2013-04-04 18:55 ` Jonathan Nieder
2013-04-08 10:10 ` Duy Nguyen
2013-04-08 10:26 ` [PATCH] t3700 (add): add failing test for add with submodules Ramkumar Ramachandra
2013-04-08 11:04 ` Duy Nguyen
2013-04-08 15:07 ` Junio C Hamano
2013-04-08 21:30 ` Jeff King
2013-04-08 22:03 ` Junio C Hamano
2013-04-08 22:07 ` Jeff King
2013-04-09 9:19 ` Ramkumar Ramachandra
2013-04-09 9:21 ` [PATCH 0/2] Fix git " Ramkumar Ramachandra
2013-04-09 9:21 ` [PATCH 1/2] t3700 (add): add two tests for testing " Ramkumar Ramachandra
2013-04-09 9:21 ` [PATCH 2/2] add: refuse to add paths beyond repository boundaries Ramkumar Ramachandra
2013-04-09 16:50 ` Jeff King
2013-04-09 17:09 ` Junio C Hamano
2013-04-09 17:34 ` Junio C Hamano
2013-04-09 17:41 ` Ramkumar Ramachandra
2013-04-09 17:54 ` Junio C Hamano
2013-04-09 18:17 ` Ramkumar Ramachandra
2013-04-09 18:50 ` Junio C Hamano
2013-04-09 19:09 ` Junio C Hamano
2013-04-09 20:31 ` Junio C Hamano
2013-04-10 13:25 ` Ramkumar Ramachandra
2013-04-10 16:25 ` Junio C Hamano
2013-04-09 17:41 ` Junio C Hamano
2013-04-09 17:56 ` Ramkumar Ramachandra
2013-04-09 18:48 ` Junio C Hamano
2013-04-10 13:38 ` Ramkumar Ramachandra
2013-04-09 18:32 ` Jakub Narębski
2013-04-09 18:51 ` Junio C Hamano
2013-04-09 18:58 ` Jakub Narębski
2013-04-09 19:10 ` Junio C Hamano
2013-04-09 16:27 ` [PATCH] t3700 (add): add failing test for add with submodules Jeff King
2013-04-09 11:43 ` Jakub Narębski
2013-04-09 11:54 ` Ramkumar Ramachandra
2013-04-09 13:49 ` Jakub Narębski
2013-04-06 20:10 ` [RFC/PATCH 0/7] Rework git core for native submodules Ramkumar Ramachandra
2013-04-07 3:31 ` Junio C Hamano
2013-04-07 7:27 ` Ramkumar Ramachandra
2013-04-07 9:00 ` Junio C Hamano
2013-04-07 10:58 ` Ramkumar Ramachandra
2013-04-07 15:51 ` Ramkumar Ramachandra
2013-04-07 16:12 ` John Keeping
2013-04-07 16:42 ` Ramkumar Ramachandra
2013-04-07 17:02 ` John Keeping
2013-04-07 17:22 ` Ramkumar Ramachandra
2013-04-07 17:52 ` John Keeping
2013-04-07 18:07 ` Ramkumar Ramachandra
2013-04-07 18:21 ` John Keeping
2013-04-07 18:34 ` Jens Lehmann
2013-04-07 18:44 ` Ramkumar Ramachandra
2013-04-07 20:15 ` Jens Lehmann
2013-04-07 20:49 ` Ramkumar Ramachandra
2013-04-07 21:02 ` John Keeping
2013-04-07 21:11 ` Ramkumar Ramachandra
2013-04-07 20:57 ` Ramkumar Ramachandra
2013-04-07 21:23 ` Jonathan Nieder
2013-04-07 21:30 ` Ramkumar Ramachandra
2013-04-08 7:48 ` Jens Lehmann
2013-04-08 8:07 ` Ramkumar Ramachandra
2013-04-08 8:19 ` Jonathan Nieder
2013-04-08 9:08 ` Ramkumar Ramachandra
2013-04-08 10:29 ` Duy Nguyen
2013-04-08 11:06 ` Ramkumar Ramachandra
2013-04-08 11:29 ` Duy Nguyen
2013-04-08 11:53 ` Ramkumar Ramachandra
2013-04-08 15:06 ` Junio C Hamano
2013-04-08 16:08 ` Ramkumar Ramachandra
2013-04-08 18:10 ` Junio C Hamano
2013-04-08 19:03 ` Ramkumar Ramachandra
2013-04-08 19:48 ` Junio C Hamano
2013-04-08 19:54 ` Ramkumar Ramachandra
2013-04-08 20:30 ` Junio C Hamano
2013-04-08 21:03 ` Ramkumar Ramachandra
2013-04-10 7:23 ` Philip Oakley
2013-04-08 21:59 ` Ramkumar Ramachandra
2013-04-09 11:51 ` Jakub Narębski
2013-04-08 11:10 ` Ramkumar Ramachandra
2013-04-08 8:37 ` Jonathan Nieder
2013-04-08 9:14 ` Ramkumar Ramachandra
2013-04-08 14:46 ` Junio C Hamano
2013-04-08 17:12 ` Junio C Hamano
2013-04-17 10:37 ` Duy Nguyen
2013-04-17 11:06 ` Ramkumar Ramachandra
2013-04-17 11:27 ` Duy Nguyen
2013-04-17 11:56 ` Ramkumar Ramachandra
2013-04-17 12:06 ` Duy Nguyen
2013-04-17 12:14 ` Ramkumar Ramachandra
[not found] ` <CALkWK0m9QmZaSDruY=+2F-Kkw+fd6E1TYC TBpVQHRJrzq2VjCQ@mail.gmail.com>
2013-04-17 23:17 ` Philip Oakley
2013-04-18 7:50 ` Ramkumar Ramachandra
2013-04-19 17:08 ` Jens Lehmann
2013-04-17 16:01 ` Junio C Hamano
2013-04-08 20:41 ` Jens Lehmann
2013-04-08 21:36 ` Jeff King
2013-04-07 18:59 ` John Keeping
2013-04-07 19:06 ` Ramkumar Ramachandra
2013-04-07 19:17 ` Ramkumar Ramachandra
2013-04-07 18:37 ` Ramkumar Ramachandra
2013-04-07 18:22 ` Ramkumar Ramachandra
2013-04-07 19:26 ` Ramkumar Ramachandra
[not found] ` <CAP8UFD3i2vc3OSAHRERpiPY7cRjqhkqcBN9hVW0QmMksnCPccw@mail.gmail.com>
2013-04-07 21:24 ` Ramkumar Ramachandra
[not found] ` <CAP8UFD16gwWjE7T75D7kUM-VOXhtZaSRGtEg8fW5kmuKDLTQHQ@mail.gmail.com>
2013-04-08 17:04 ` Ramkumar Ramachandra
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=1365100243-13676-2-git-send-email-artagnon@gmail.com \
--to=artagnon@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=torvalds@linux-foundation.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.
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).