* Remove diff machinery dependency from read-cache
@ 2010-01-21 19:37 Linus Torvalds
2010-01-21 20:07 ` Junio C Hamano
` (2 more replies)
0 siblings, 3 replies; 23+ messages in thread
From: Linus Torvalds @ 2010-01-21 19:37 UTC (permalink / raw)
To: Junio C Hamano, Git Mailing List
Exal Sibeaz pointed out that some git files are way too big, and that
add_files_to_cache() brings in all the diff machinery to any git binary
that needs the basic git SHA1 object operations from read-cache.c. Which
is pretty much all of them.
It's doubly silly, since add_files_to_cache() is only used by builtin
programs (add, checkout and commit), so it's fairly easily fixed by just
moving the thing to builtin-add.c, and avoiding the dependency entirely.
I initially argued to Exal that it would probably be best to try to depend
on smart compilers and linkers, but after spending some time trying to
make -ffunction-sections work and giving up, I think Exal was right, and
the fix is to just do some trivial cleanups like this.
This trivial cleanup results in pretty stunning file size differences.
The diff machinery really is mostly used by just the builtin programs, and
you have things like these trivial before-and-after numbers:
-rwxr-xr-x 1 torvalds torvalds 1727420 2010-01-21 10:53 git-hash-object
-rwxrwxr-x 1 torvalds torvalds 940265 2010-01-21 11:16 git-hash-object
Now, I'm not saying that 940kB is good either, but that's mostly all the
debug information - you can see the real code with 'size':
text data bss dec hex filename
418675 3920 127408 550003 86473 git-hash-object (before)
230650 2288 111728 344666 5425a git-hash-object (after)
ie we have a nice 24% size reduction from this trivial cleanup.
It's not just that one file either. I get:
[torvalds@nehalem git]$ du -s /home/torvalds/libexec/git-core
45640 /home/torvalds/libexec/git-core (before)
33508 /home/torvalds/libexec/git-core (after)
so we're talking 12MB of diskspace here.
(Of course, stripping all the binaries brings the 33MB down to 9MB, so the
whole debug information thing is still the bulk of it all, but that's a
separate issue entirely)
Now, I'm sure there are other things we should do, and changing our
compiler flags from -O2 to -Os would bring the text size down by an
additional almost 20%, but this thing Exal pointed out seems to be some
good low-hanging fruit.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
---
builtin-add.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
read-cache.c | 78 ---------------------------------------------------------
2 files changed, 76 insertions(+), 78 deletions(-)
diff --git a/builtin-add.c b/builtin-add.c
index cb6e590..2705f8d 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -11,6 +11,7 @@
#include "run-command.h"
#include "parse-options.h"
#include "diff.h"
+#include "diffcore.h"
#include "revision.h"
static const char * const builtin_add_usage[] = {
@@ -20,6 +21,81 @@ static const char * const builtin_add_usage[] = {
static int patch_interactive, add_interactive, edit_interactive;
static int take_worktree_changes;
+struct update_callback_data
+{
+ int flags;
+ int add_errors;
+};
+
+static void update_callback(struct diff_queue_struct *q,
+ struct diff_options *opt, void *cbdata)
+{
+ int i;
+ struct update_callback_data *data = cbdata;
+
+ for (i = 0; i < q->nr; i++) {
+ struct diff_filepair *p = q->queue[i];
+ const char *path = p->one->path;
+ switch (p->status) {
+ default:
+ die("unexpected diff status %c", p->status);
+ case DIFF_STATUS_UNMERGED:
+ /*
+ * ADD_CACHE_IGNORE_REMOVAL is unset if "git
+ * add -u" is calling us, In such a case, a
+ * missing work tree file needs to be removed
+ * if there is an unmerged entry at stage #2,
+ * but such a diff record is followed by
+ * another with DIFF_STATUS_DELETED (and if
+ * there is no stage #2, we won't see DELETED
+ * nor MODIFIED). We can simply continue
+ * either way.
+ */
+ if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL))
+ continue;
+ /*
+ * Otherwise, it is "git add path" is asking
+ * to explicitly add it; we fall through. A
+ * missing work tree file is an error and is
+ * caught by add_file_to_index() in such a
+ * case.
+ */
+ case DIFF_STATUS_MODIFIED:
+ case DIFF_STATUS_TYPE_CHANGED:
+ if (add_file_to_index(&the_index, path, data->flags)) {
+ if (!(data->flags & ADD_CACHE_IGNORE_ERRORS))
+ die("updating files failed");
+ data->add_errors++;
+ }
+ break;
+ case DIFF_STATUS_DELETED:
+ if (data->flags & ADD_CACHE_IGNORE_REMOVAL)
+ break;
+ if (!(data->flags & ADD_CACHE_PRETEND))
+ remove_file_from_index(&the_index, path);
+ if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE))
+ printf("remove '%s'\n", path);
+ break;
+ }
+ }
+}
+
+int add_files_to_cache(const char *prefix, const char **pathspec, int flags)
+{
+ struct update_callback_data data;
+ struct rev_info rev;
+ init_revisions(&rev, prefix);
+ setup_revisions(0, NULL, &rev, NULL);
+ rev.prune_data = pathspec;
+ rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
+ rev.diffopt.format_callback = update_callback;
+ data.flags = flags;
+ data.add_errors = 0;
+ rev.diffopt.format_callback_data = &data;
+ run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
+ return !!data.add_errors;
+}
+
static void fill_pathspec_matches(const char **pathspec, char *seen, int specs)
{
int num_unmatched = 0, i;
diff --git a/read-cache.c b/read-cache.c
index edd9959..79938bf 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -10,9 +10,6 @@
#include "dir.h"
#include "tree.h"
#include "commit.h"
-#include "diff.h"
-#include "diffcore.h"
-#include "revision.h"
#include "blob.h"
#include "resolve-undo.h"
@@ -1648,81 +1645,6 @@ int read_index_unmerged(struct index_state *istate)
return unmerged;
}
-struct update_callback_data
-{
- int flags;
- int add_errors;
-};
-
-static void update_callback(struct diff_queue_struct *q,
- struct diff_options *opt, void *cbdata)
-{
- int i;
- struct update_callback_data *data = cbdata;
-
- for (i = 0; i < q->nr; i++) {
- struct diff_filepair *p = q->queue[i];
- const char *path = p->one->path;
- switch (p->status) {
- default:
- die("unexpected diff status %c", p->status);
- case DIFF_STATUS_UNMERGED:
- /*
- * ADD_CACHE_IGNORE_REMOVAL is unset if "git
- * add -u" is calling us, In such a case, a
- * missing work tree file needs to be removed
- * if there is an unmerged entry at stage #2,
- * but such a diff record is followed by
- * another with DIFF_STATUS_DELETED (and if
- * there is no stage #2, we won't see DELETED
- * nor MODIFIED). We can simply continue
- * either way.
- */
- if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL))
- continue;
- /*
- * Otherwise, it is "git add path" is asking
- * to explicitly add it; we fall through. A
- * missing work tree file is an error and is
- * caught by add_file_to_index() in such a
- * case.
- */
- case DIFF_STATUS_MODIFIED:
- case DIFF_STATUS_TYPE_CHANGED:
- if (add_file_to_index(&the_index, path, data->flags)) {
- if (!(data->flags & ADD_CACHE_IGNORE_ERRORS))
- die("updating files failed");
- data->add_errors++;
- }
- break;
- case DIFF_STATUS_DELETED:
- if (data->flags & ADD_CACHE_IGNORE_REMOVAL)
- break;
- if (!(data->flags & ADD_CACHE_PRETEND))
- remove_file_from_index(&the_index, path);
- if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE))
- printf("remove '%s'\n", path);
- break;
- }
- }
-}
-
-int add_files_to_cache(const char *prefix, const char **pathspec, int flags)
-{
- struct update_callback_data data;
- struct rev_info rev;
- init_revisions(&rev, prefix);
- setup_revisions(0, NULL, &rev, NULL);
- rev.prune_data = pathspec;
- rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
- rev.diffopt.format_callback = update_callback;
- data.flags = flags;
- data.add_errors = 0;
- rev.diffopt.format_callback_data = &data;
- run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
- return !!data.add_errors;
-}
-
/*
* Returns 1 if the path is an "other" path with respect to
* the index; that is, the path is not mentioned in the index at all,
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-21 19:37 Remove diff machinery dependency from read-cache Linus Torvalds
@ 2010-01-21 20:07 ` Junio C Hamano
2010-01-21 20:15 ` Linus Torvalds
2010-01-22 3:58 ` Linus Torvalds
2010-01-23 6:31 ` Brian Campbell
2 siblings, 1 reply; 23+ messages in thread
From: Junio C Hamano @ 2010-01-21 20:07 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Git Mailing List
Linus Torvalds <torvalds@linux-foundation.org> writes:
> This trivial cleanup results in pretty stunning file size differences.
> The diff machinery really is mostly used by just the builtin programs, and
> you have things like these trivial before-and-after numbers:
>
> -rwxr-xr-x 1 torvalds torvalds 1727420 2010-01-21 10:53 git-hash-object
> -rwxrwxr-x 1 torvalds torvalds 940265 2010-01-21 11:16 git-hash-object
>
> Now, I'm not saying that 940kB is good either, but that's mostly all the
> debug information - you can see the real code with 'size':
>
> text data bss dec hex filename
> 418675 3920 127408 550003 86473 git-hash-object (before)
> 230650 2288 111728 344666 5425a git-hash-object (after)
>
> ie we have a nice 24% size reduction from this trivial cleanup.
The patch itself to move add_files_to_cache() to builtin-add.c (or to its
own file) makes sense from the code placement POV, but if the goal is to
shrink the on-disk footprint, isn't an alternative approach be to make
hash-object built-in? You can lose the whole 1.7M from the filesystem
footprint that way, no?
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-21 20:07 ` Junio C Hamano
@ 2010-01-21 20:15 ` Linus Torvalds
2010-01-21 22:18 ` Linus Torvalds
0 siblings, 1 reply; 23+ messages in thread
From: Linus Torvalds @ 2010-01-21 20:15 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Git Mailing List
On Thu, 21 Jan 2010, Junio C Hamano wrote:
>
> The patch itself to move add_files_to_cache() to builtin-add.c (or to its
> own file) makes sense from the code placement POV, but if the goal is to
> shrink the on-disk footprint, isn't an alternative approach be to make
> hash-object built-in? You can lose the whole 1.7M from the filesystem
> footprint that way, no?
Sure. Except, as I mentioned, it's not just git-hash-object. It's _all_ of
them.
The total space savings wasn't 1.7M, it was 12M.
Linus
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-21 20:15 ` Linus Torvalds
@ 2010-01-21 22:18 ` Linus Torvalds
2010-01-21 23:25 ` Linus Torvalds
0 siblings, 1 reply; 23+ messages in thread
From: Linus Torvalds @ 2010-01-21 22:18 UTC (permalink / raw)
To: Junio C Hamano, Shawn O. Pearce; +Cc: Git Mailing List
On Thu, 21 Jan 2010, Linus Torvalds wrote:
>
> Sure. Except, as I mentioned, it's not just git-hash-object. It's _all_ of
> them.
>
> The total space savings wasn't 1.7M, it was 12M.
There are some other interesting cases. For example, look at this:
[torvalds@nehalem git]$ size show-index.o git-show-index
text data bss dec hex filename
1310 0 1024 2334 91e show-index.o
222706 2296 112720 337722 5273a git-show-index
ie a trivial program like 'show-index' has ballooned to 220kB. Let's look
at why:
[torvalds@nehalem git]$ nm show-index.o | grep ' U '
U die
U fread
U free
U printf
U sha1_to_hex
U stdin
U usage
U xmalloc
ok, if you ignore standard library things (which will be from a shared
library anyway), it really only wants totally trivial things: die,
xmalloc, and sha1_to_hex. Those should be a few hundred bytes, not a few
hundred _kilo_bytes.
So what happens?
- sha1_to_hex brings in all of sha1_file.c, even though it doesn't need
any of it. Ok, that's easily fixed: split up the hex helpers into a
file of its own ("hex.c")
- "die()" brings in usage.c, which is actually designed correctly, so it
is all fine. No extra pain there. Sure, we'll get some other trivial
stuff from there, but we're talking maybe a kilobyte of code.
- "xmalloc()" brings in the trivial wrappers.
OOPS.
Those wrappers bring in zlib (through git_inflate*), which is not a huge
issue, we coult just move the git_inflate*() wrappers to its own file.
Trivial. But the wrappers also bring in:
- xmalloc/xrealloc/xstrdup:
U release_pack_memory
which in turn brings in _all_ of the rest of the git libraries. End
result: a trivial git helper program that _should_ be a couple of
kilobytes in size ends up being 200+kB of text, and 900kB with debug
information.
Absolutely _none_ of which is in the least useful.
Oh well.
We could fix it a few ways
- ignore it. Most git programs will get the pack handling functions
anyway, since they want to get object reading.
- as mentioned, just build in _everything_ so that we only ever have one
binary
- get rid of release_pack_memory() entirely. We have better ways to limit
pack memory use these days, but they do require configuration (we do
have a default packed_git_limit, though, so even without any explicit
configuration it's not insane).
- don't have explicit knowledge about 'release_pack_memory' in xmalloc,
but instead have the packing functions register a "xmalloc
pressure_reliever function". So then programs that have pack handling
will register the fixup function, and programs that don't will never
even know.
Hmm? We have about 20 external programs that may hide issues like this.
Linus
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-21 22:18 ` Linus Torvalds
@ 2010-01-21 23:25 ` Linus Torvalds
2010-01-22 0:45 ` Junio C Hamano
0 siblings, 1 reply; 23+ messages in thread
From: Linus Torvalds @ 2010-01-21 23:25 UTC (permalink / raw)
To: Junio C Hamano, Shawn O. Pearce; +Cc: Git Mailing List
On Thu, 21 Jan 2010, Linus Torvalds wrote:
>
> We could fix it a few ways
>
> - ignore it. Most git programs will get the pack handling functions
> anyway, since they want to get object reading.
In fact, we should probably remove git-show-index. It may have some
historical significance as a pack-file index debugger, but it has no
actual redeeming features now, considering that the binary is a megabyte
of useless crud with debugging info.
However, we do actually use it in t/t5302-pack-index.sh. So in the
meantime, how about this hacky patch to simply just avoid xmalloc, and
separating out the trivial hex functions into "hex.o".
This results in
[torvalds@nehalem git]$ size git-show-index
text data bss dec hex filename
222818 2276 112688 337782 52776 git-show-index (before)
5696 624 1264 7584 1da0 git-show-index (after)
which is a whole lot better, no?
(Or make it a built-in, if we actually think we want to carry it along in
the long run)
Linus
---
Makefile | 1 +
sha1_file.c | 66 ----------------------------------------------------------
show-index.c | 2 +-
3 files changed, 2 insertions(+), 67 deletions(-)
diff --git a/Makefile b/Makefile
index ad890ec..a041b69 100644
--- a/Makefile
+++ b/Makefile
@@ -559,6 +559,7 @@ LIB_OBJS += graph.o
LIB_OBJS += grep.o
LIB_OBJS += hash.o
LIB_OBJS += help.o
+LIB_OBJS += hex.o
LIB_OBJS += ident.o
LIB_OBJS += levenshtein.o
LIB_OBJS += list-objects.o
diff --git a/sha1_file.c b/sha1_file.c
index 7086760..12478a3 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -35,54 +35,6 @@ static size_t sz_fmt(size_t s) { return s; }
const unsigned char null_sha1[20];
-const signed char hexval_table[256] = {
- -1, -1, -1, -1, -1, -1, -1, -1, /* 00-07 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 08-0f */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 10-17 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 18-1f */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 20-27 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 28-2f */
- 0, 1, 2, 3, 4, 5, 6, 7, /* 30-37 */
- 8, 9, -1, -1, -1, -1, -1, -1, /* 38-3f */
- -1, 10, 11, 12, 13, 14, 15, -1, /* 40-47 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 48-4f */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 50-57 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 58-5f */
- -1, 10, 11, 12, 13, 14, 15, -1, /* 60-67 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 68-67 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 70-77 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 78-7f */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 80-87 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 88-8f */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 90-97 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* 98-9f */
- -1, -1, -1, -1, -1, -1, -1, -1, /* a0-a7 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* a8-af */
- -1, -1, -1, -1, -1, -1, -1, -1, /* b0-b7 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* b8-bf */
- -1, -1, -1, -1, -1, -1, -1, -1, /* c0-c7 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* c8-cf */
- -1, -1, -1, -1, -1, -1, -1, -1, /* d0-d7 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* d8-df */
- -1, -1, -1, -1, -1, -1, -1, -1, /* e0-e7 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* e8-ef */
- -1, -1, -1, -1, -1, -1, -1, -1, /* f0-f7 */
- -1, -1, -1, -1, -1, -1, -1, -1, /* f8-ff */
-};
-
-int get_sha1_hex(const char *hex, unsigned char *sha1)
-{
- int i;
- for (i = 0; i < 20; i++) {
- unsigned int val = (hexval(hex[0]) << 4) | hexval(hex[1]);
- if (val & ~0xff)
- return -1;
- *sha1++ = val;
- hex += 2;
- }
- return 0;
-}
-
static inline int offset_1st_component(const char *path)
{
if (has_dos_drive_prefix(path))
@@ -133,24 +85,6 @@ int safe_create_leading_directories_const(const char *path)
return result;
}
-char *sha1_to_hex(const unsigned char *sha1)
-{
- static int bufno;
- static char hexbuffer[4][50];
- static const char hex[] = "0123456789abcdef";
- char *buffer = hexbuffer[3 & ++bufno], *buf = buffer;
- int i;
-
- for (i = 0; i < 20; i++) {
- unsigned int val = *sha1++;
- *buf++ = hex[val >> 4];
- *buf++ = hex[val & 0xf];
- }
- *buf = '\0';
-
- return buffer;
-}
-
static void fill_sha1_path(char *pathbuf, const unsigned char *sha1)
{
int i;
diff --git a/show-index.c b/show-index.c
index 63f9da5..4c0ac13 100644
--- a/show-index.c
+++ b/show-index.c
@@ -48,7 +48,7 @@ int main(int argc, char **argv)
unsigned char sha1[20];
uint32_t crc;
uint32_t off;
- } *entries = xmalloc(nr * sizeof(entries[0]));
+ } *entries = malloc(nr * sizeof(entries[0]));
for (i = 0; i < nr; i++)
if (fread(entries[i].sha1, 20, 1, stdin) != 1)
die("unable to read sha1 %u/%u", i, nr);
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-21 23:25 ` Linus Torvalds
@ 2010-01-22 0:45 ` Junio C Hamano
2010-01-22 0:59 ` Johannes Schindelin
` (2 more replies)
0 siblings, 3 replies; 23+ messages in thread
From: Junio C Hamano @ 2010-01-22 0:45 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Shawn O. Pearce, Git Mailing List
Linus Torvalds <torvalds@linux-foundation.org> writes:
> On Thu, 21 Jan 2010, Linus Torvalds wrote:
>>
>> We could fix it a few ways
>>
>> - ignore it. Most git programs will get the pack handling functions
>> anyway, since they want to get object reading.
>
> In fact, we should probably remove git-show-index. It may have some
> historical significance as a pack-file index debugger, but it has no
> actual redeeming features now, considering that the binary is a megabyte
> of useless crud with debugging info.
>
> However, we do actually use it in t/t5302-pack-index.sh. So in the
> meantime, how about this hacky patch to simply just avoid xmalloc, and
> separating out the trivial hex functions into "hex.o".
>
> This results in
>
> [torvalds@nehalem git]$ size git-show-index
> text data bss dec hex filename
> 222818 2276 112688 337782 52776 git-show-index (before)
> 5696 624 1264 7584 1da0 git-show-index (after)
>
> which is a whole lot better, no?
>
> (Or make it a built-in, if we actually think we want to carry it along in
> the long run)
We tend to not remove things unless we are absolutely certain nobody uses
it, so probably making it built-in would be preferrable. I don't think
show-index is used very often if ever, but scripts that use hash-object
would use it really often and would do so via its --stdin interface if it
knows that it is creating more than a dozen objects, so start-up time
required to map the whole git is probably not an issue.
By the way, do you think anybody still uses "git merge-trees"?
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 0:45 ` Junio C Hamano
@ 2010-01-22 0:59 ` Johannes Schindelin
2010-01-22 1:01 ` Junio C Hamano
2010-01-22 2:20 ` Linus Torvalds
2010-01-22 2:35 ` Remove diff machinery dependency from read-cache Nicolas Pitre
2 siblings, 1 reply; 23+ messages in thread
From: Johannes Schindelin @ 2010-01-22 0:59 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Linus Torvalds, Shawn O. Pearce, Git Mailing List
Hi,
On Thu, 21 Jan 2010, Junio C Hamano wrote:
> By the way, do you think anybody still uses "git merge-trees"?
IMO this is the only viable way to a non-broken merge-recursive. Removing
it would be counterproductive.
Ciao,
Dscho
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 0:59 ` Johannes Schindelin
@ 2010-01-22 1:01 ` Junio C Hamano
2010-01-22 1:43 ` Johannes Schindelin
0 siblings, 1 reply; 23+ messages in thread
From: Junio C Hamano @ 2010-01-22 1:01 UTC (permalink / raw)
To: Johannes Schindelin
Cc: Junio C Hamano, Linus Torvalds, Shawn O. Pearce, Git Mailing List
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> On Thu, 21 Jan 2010, Junio C Hamano wrote:
>
>> By the way, do you think anybody still uses "git merge-trees"?
>
> IMO this is the only viable way to a non-broken merge-recursive. Removing
> it would be counterproductive.
Do you mean you don't think
Subject: Re: git-merge segfault in 1.6.6 and master
Date: Thu, 21 Jan 2010 16:38:56 -0800
Message-ID: <7vaaw7j7mn.fsf@alter.siamese.dyndns.org>
...
In the meantime, I think applying this patch is the right thing to do.
-- >8 --
Subject: merge-recursive: do not return NULL only to cause segfault
would help us?
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 1:01 ` Junio C Hamano
@ 2010-01-22 1:43 ` Johannes Schindelin
2010-01-22 3:50 ` Junio C Hamano
0 siblings, 1 reply; 23+ messages in thread
From: Johannes Schindelin @ 2010-01-22 1:43 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Linus Torvalds, Shawn O. Pearce, Git Mailing List
Hi,
On Thu, 21 Jan 2010, Junio C Hamano wrote:
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
>
> > On Thu, 21 Jan 2010, Junio C Hamano wrote:
> >
> >> By the way, do you think anybody still uses "git merge-trees"?
> >
> > IMO this is the only viable way to a non-broken merge-recursive. Removing
> > it would be counterproductive.
>
> Do you mean you don't think
>
> Subject: Re: git-merge segfault in 1.6.6 and master
> Date: Thu, 21 Jan 2010 16:38:56 -0800
> Message-ID: <7vaaw7j7mn.fsf@alter.siamese.dyndns.org>
>
> ...
> In the meantime, I think applying this patch is the right thing to do.
>
> -- >8 --
> Subject: merge-recursive: do not return NULL only to cause segfault
>
> would help us?
Sorry, I cannot have a look at this now.
But in the long run, I think that it gets tiring to chase all kinds of
weird interactions between unpack_trees(), the rename detection and the
recursive merge.
I could see merge-trees as a viable alternative approach.
Ciao,
Dscho
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 0:45 ` Junio C Hamano
2010-01-22 0:59 ` Johannes Schindelin
@ 2010-01-22 2:20 ` Linus Torvalds
2010-01-22 2:25 ` Linus Torvalds
2010-01-22 2:35 ` Remove diff machinery dependency from read-cache Nicolas Pitre
2 siblings, 1 reply; 23+ messages in thread
From: Linus Torvalds @ 2010-01-22 2:20 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Shawn O. Pearce, Git Mailing List
On Thu, 21 Jan 2010, Junio C Hamano wrote:
>
> We tend to not remove things unless we are absolutely certain nobody uses
> it, so probably making it built-in would be preferrable. I don't think
> show-index is used very often if ever, but scripts that use hash-object
> would use it really often and would do so via its --stdin interface if it
> knows that it is creating more than a dozen objects, so start-up time
> required to map the whole git is probably not an issue.
git-show-index should certainly be easy to turn into a built-in too. Patch
appended.
> By the way, do you think anybody still uses "git merge-trees"?
I dunno. I think it has some conceptual advantages, but realistically, I
doubt anybody is willing to go through the pain to make it grow up enough
to become a viable alternative to our current situation.
Linus
---
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Thu Jan 21 18:16:49 2010 -0800
Subject: Turn 'show-index' into a builtin
.. rather than being a huge executable just because it sucks in all the
git library code and then does something really trivial.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
---
Makefile | 2 +-
show-index.c => builtin-show-index.c | 2 +-
builtin.h | 1 +
git.c | 3 ++-
4 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/Makefile b/Makefile
index ad890ec..3439d2c 100644
--- a/Makefile
+++ b/Makefile
@@ -396,7 +396,6 @@ PROGRAMS += git-mktag$X
PROGRAMS += git-pack-redundant$X
PROGRAMS += git-patch-id$X
PROGRAMS += git-shell$X
-PROGRAMS += git-show-index$X
PROGRAMS += git-unpack-file$X
PROGRAMS += git-upload-pack$X
PROGRAMS += git-var$X
@@ -693,6 +692,7 @@ BUILTIN_OBJS += builtin-rm.o
BUILTIN_OBJS += builtin-send-pack.o
BUILTIN_OBJS += builtin-shortlog.o
BUILTIN_OBJS += builtin-show-branch.o
+BUILTIN_OBJS += builtin-show-index.o
BUILTIN_OBJS += builtin-show-ref.o
BUILTIN_OBJS += builtin-stripspace.o
BUILTIN_OBJS += builtin-symbolic-ref.o
diff --git a/show-index.c b/builtin-show-index.c
similarity index 96%
rename from show-index.c
rename to builtin-show-index.c
index 63f9da5..92202b8 100644
--- a/show-index.c
+++ b/builtin-show-index.c
@@ -4,7 +4,7 @@
static const char show_index_usage[] =
"git show-index < <packed archive index>";
-int main(int argc, char **argv)
+int cmd_show_index(int argc, const char **argv, const char *prefix)
{
int i;
unsigned nr;
diff --git a/builtin.h b/builtin.h
index c3f83c0..4d73d7c 100644
--- a/builtin.h
+++ b/builtin.h
@@ -93,6 +93,7 @@ extern int cmd_send_pack(int argc, const char **argv, const char *prefix);
extern int cmd_shortlog(int argc, const char **argv, const char *prefix);
extern int cmd_show(int argc, const char **argv, const char *prefix);
extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
+extern int cmd_show_index(int argc, const char **argv, const char *prefix);
extern int cmd_status(int argc, const char **argv, const char *prefix);
extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
extern int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
diff --git a/git.c b/git.c
index 194471f..5fabf18 100644
--- a/git.c
+++ b/git.c
@@ -358,8 +358,9 @@ static void handle_internal_command(int argc, const char **argv)
{ "rm", cmd_rm, RUN_SETUP },
{ "send-pack", cmd_send_pack, RUN_SETUP },
{ "shortlog", cmd_shortlog, USE_PAGER },
- { "show-branch", cmd_show_branch, RUN_SETUP },
{ "show", cmd_show, RUN_SETUP | USE_PAGER },
+ { "show-branch", cmd_show_branch, RUN_SETUP },
+ { "show-index", cmd_show_index },
{ "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
{ "stripspace", cmd_stripspace },
{ "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 2:20 ` Linus Torvalds
@ 2010-01-22 2:25 ` Linus Torvalds
2010-01-22 3:50 ` Linus Torvalds
2010-01-22 8:43 ` Johannes Sixt
0 siblings, 2 replies; 23+ messages in thread
From: Linus Torvalds @ 2010-01-22 2:25 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Shawn O. Pearce, Git Mailing List
On Thu, 21 Jan 2010, Linus Torvalds wrote:
>
> > By the way, do you think anybody still uses "git merge-trees"?
>
> I dunno. I think it has some conceptual advantages, but realistically, I
> doubt anybody is willing to go through the pain to make it grow up enough
> to become a viable alternative to our current situation.
This makes it a built-in, at least, so it doesn't waste the diskspace.
Linus
---
Makefile | 2 +-
merge-tree.c => builtin-merge-tree.c | 4 +---
builtin.h | 1 +
git.c | 1 +
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Makefile b/Makefile
index 3439d2c..35aea16 100644
--- a/Makefile
+++ b/Makefile
@@ -391,7 +391,6 @@ PROGRAMS += git-hash-object$X
PROGRAMS += git-imap-send$X
PROGRAMS += git-index-pack$X
PROGRAMS += git-merge-index$X
-PROGRAMS += git-merge-tree$X
PROGRAMS += git-mktag$X
PROGRAMS += git-pack-redundant$X
PROGRAMS += git-patch-id$X
@@ -670,6 +669,7 @@ BUILTIN_OBJS += builtin-merge-base.o
BUILTIN_OBJS += builtin-merge-file.o
BUILTIN_OBJS += builtin-merge-ours.o
BUILTIN_OBJS += builtin-merge-recursive.o
+BUILTIN_OBJS += builtin-merge-tree.o
BUILTIN_OBJS += builtin-mktree.o
BUILTIN_OBJS += builtin-mv.o
BUILTIN_OBJS += builtin-name-rev.o
diff --git a/merge-tree.c b/builtin-merge-tree.c
similarity index 99%
rename from merge-tree.c
rename to builtin-merge-tree.c
index 37b94d9..8e16c3e 100644
--- a/merge-tree.c
+++ b/builtin-merge-tree.c
@@ -337,7 +337,7 @@ static void *get_tree_descriptor(struct tree_desc *desc, const char *rev)
return buf;
}
-int main(int argc, char **argv)
+int cmd_merge_tree(int argc, const char **argv, const char *prefix)
{
struct tree_desc t[3];
void *buf1, *buf2, *buf3;
@@ -347,8 +347,6 @@ int main(int argc, char **argv)
git_extract_argv0_path(argv[0]);
- setup_git_directory();
-
buf1 = get_tree_descriptor(t+0, argv[1]);
buf2 = get_tree_descriptor(t+1, argv[2]);
buf3 = get_tree_descriptor(t+2, argv[3]);
diff --git a/builtin.h b/builtin.h
index 4d73d7c..06bf04e 100644
--- a/builtin.h
+++ b/builtin.h
@@ -70,6 +70,7 @@ extern int cmd_merge_base(int argc, const char **argv, const char *prefix);
extern int cmd_merge_ours(int argc, const char **argv, const char *prefix);
extern int cmd_merge_file(int argc, const char **argv, const char *prefix);
extern int cmd_merge_recursive(int argc, const char **argv, const char *prefix);
+extern int cmd_merge_tree(int argc, const char **argv, const char *prefix);
extern int cmd_mktree(int argc, const char **argv, const char *prefix);
extern int cmd_mv(int argc, const char **argv, const char *prefix);
extern int cmd_name_rev(int argc, const char **argv, const char *prefix);
diff --git a/git.c b/git.c
index 5fabf18..e5964a8 100644
--- a/git.c
+++ b/git.c
@@ -335,6 +335,7 @@ static void handle_internal_command(int argc, const char **argv)
{ "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
{ "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
{ "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
+ { "merge-tree", cmd_merge_tree, RUN_SETUP },
{ "mktree", cmd_mktree, RUN_SETUP },
{ "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
{ "name-rev", cmd_name_rev, RUN_SETUP },
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 0:45 ` Junio C Hamano
2010-01-22 0:59 ` Johannes Schindelin
2010-01-22 2:20 ` Linus Torvalds
@ 2010-01-22 2:35 ` Nicolas Pitre
2010-01-22 2:44 ` Linus Torvalds
` (2 more replies)
2 siblings, 3 replies; 23+ messages in thread
From: Nicolas Pitre @ 2010-01-22 2:35 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Linus Torvalds, Shawn O. Pearce, Git Mailing List
On Thu, 21 Jan 2010, Junio C Hamano wrote:
> Linus Torvalds <torvalds@linux-foundation.org> writes:
>
> > On Thu, 21 Jan 2010, Linus Torvalds wrote:
> >>
> >> We could fix it a few ways
> >>
> >> - ignore it. Most git programs will get the pack handling functions
> >> anyway, since they want to get object reading.
> >
> > In fact, we should probably remove git-show-index. It may have some
> > historical significance as a pack-file index debugger, but it has no
> > actual redeeming features now, considering that the binary is a megabyte
> > of useless crud with debugging info.
> >
> > However, we do actually use it in t/t5302-pack-index.sh. So in the
> > meantime, how about this hacky patch to simply just avoid xmalloc, and
> > separating out the trivial hex functions into "hex.o".
> >
> > This results in
> >
> > [torvalds@nehalem git]$ size git-show-index
> > text data bss dec hex filename
> > 222818 2276 112688 337782 52776 git-show-index (before)
> > 5696 624 1264 7584 1da0 git-show-index (after)
> >
> > which is a whole lot better, no?
> >
> > (Or make it a built-in, if we actually think we want to carry it along in
> > the long run)
>
> We tend to not remove things unless we are absolutely certain nobody uses
> it, so probably making it built-in would be preferrable. I don't think
> show-index is used very often if ever, but scripts that use hash-object
> would use it really often and would do so via its --stdin interface if it
> knows that it is creating more than a dozen objects, so start-up time
> required to map the whole git is probably not an issue.
I do use it, but for developing/debugging pack stuff.
I don't suggest removing it, but I don't think making it a built-in has
value either.
So I really think that Linus' patch (which is missing hex.c btw) is a
good thing to do, even if only for the cleanup value.
Then, git-show-index could probably become test-show-index and no longer
leave the build directory.
Nicolas
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 2:35 ` Remove diff machinery dependency from read-cache Nicolas Pitre
@ 2010-01-22 2:44 ` Linus Torvalds
2010-01-22 3:56 ` Junio C Hamano
2010-01-22 4:31 ` Linus Torvalds
2 siblings, 0 replies; 23+ messages in thread
From: Linus Torvalds @ 2010-01-22 2:44 UTC (permalink / raw)
To: Nicolas Pitre; +Cc: Junio C Hamano, Shawn O. Pearce, Git Mailing List
On Thu, 21 Jan 2010, Nicolas Pitre wrote:
>
> So I really think that Linus' patch (which is missing hex.c btw) is a
> good thing to do, even if only for the cleanup value.
Gaah. hex.c was the obvious code movement with just a "cache.h" include at
the top. However, I already threw away that whole tree in favor of the
built-in version, and now I'm too lazy to re-create it.
Linus
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 2:25 ` Linus Torvalds
@ 2010-01-22 3:50 ` Linus Torvalds
2010-01-22 8:43 ` Johannes Sixt
1 sibling, 0 replies; 23+ messages in thread
From: Linus Torvalds @ 2010-01-22 3:50 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Shawn O. Pearce, Git Mailing List
On Thu, 21 Jan 2010, Linus Torvalds wrote:
>
> This makes it a built-in, at least, so it doesn't waste the diskspace.
.. and here's 'git hash-object' as a built-in.
Linus
---
Makefile | 2 +-
hash-object.c => builtin-hash-object.c | 5 +----
builtin.h | 1 +
git.c | 1 +
4 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/Makefile b/Makefile
index 35aea16..f9e4aa3 100644
--- a/Makefile
+++ b/Makefile
@@ -387,7 +387,6 @@ EXTRA_PROGRAMS =
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
PROGRAMS += git-fast-import$X
-PROGRAMS += git-hash-object$X
PROGRAMS += git-imap-send$X
PROGRAMS += git-index-pack$X
PROGRAMS += git-merge-index$X
@@ -656,6 +655,7 @@ BUILTIN_OBJS += builtin-for-each-ref.o
BUILTIN_OBJS += builtin-fsck.o
BUILTIN_OBJS += builtin-gc.o
BUILTIN_OBJS += builtin-grep.o
+BUILTIN_OBJS += builtin-hash-object.o
BUILTIN_OBJS += builtin-help.o
BUILTIN_OBJS += builtin-init-db.o
BUILTIN_OBJS += builtin-log.o
diff --git a/hash-object.c b/builtin-hash-object.c
similarity index 97%
rename from hash-object.c
rename to builtin-hash-object.c
index 9455dd0..6a5f5b5 100644
--- a/hash-object.c
+++ b/builtin-hash-object.c
@@ -73,17 +73,14 @@ static const struct option hash_object_options[] = {
OPT_END()
};
-int main(int argc, const char **argv)
+int cmd_hash_object(int argc, const char **argv, const char *prefix)
{
int i;
- const char *prefix = NULL;
int prefix_length = -1;
const char *errstr = NULL;
type = blob_type;
- git_extract_argv0_path(argv[0]);
-
argc = parse_options(argc, argv, NULL, hash_object_options,
hash_object_usage, 0);
diff --git a/builtin.h b/builtin.h
index 06bf04e..3aa6b6c 100644
--- a/builtin.h
+++ b/builtin.h
@@ -55,6 +55,7 @@ extern int cmd_fsck(int argc, const char **argv, const char *prefix);
extern int cmd_gc(int argc, const char **argv, const char *prefix);
extern int cmd_get_tar_commit_id(int argc, const char **argv, const char *prefix);
extern int cmd_grep(int argc, const char **argv, const char *prefix);
+extern int cmd_hash_object(int argc, const char **argv, const char *prefix);
extern int cmd_help(int argc, const char **argv, const char *prefix);
extern int cmd_http_fetch(int argc, const char **argv, const char *prefix);
extern int cmd_init_db(int argc, const char **argv, const char *prefix);
diff --git a/git.c b/git.c
index e5964a8..a952663 100644
--- a/git.c
+++ b/git.c
@@ -318,6 +318,7 @@ static void handle_internal_command(int argc, const char **argv)
{ "gc", cmd_gc, RUN_SETUP },
{ "get-tar-commit-id", cmd_get_tar_commit_id },
{ "grep", cmd_grep, USE_PAGER },
+ { "hash-object", cmd_hash_object },
{ "help", cmd_help },
{ "init", cmd_init_db },
{ "init-db", cmd_init_db },
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 1:43 ` Johannes Schindelin
@ 2010-01-22 3:50 ` Junio C Hamano
0 siblings, 0 replies; 23+ messages in thread
From: Junio C Hamano @ 2010-01-22 3:50 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Linus Torvalds, Shawn O. Pearce, Git Mailing List
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
>> In the meantime, I think applying this patch is the right thing to do.
>>
>> -- >8 --
>> Subject: merge-recursive: do not return NULL only to cause segfault
>>
>> would help us?
>
> Sorry, I cannot have a look at this now.
That's fine; I know you've been busy outside git (you've kept saying that
for past several months), and I didn't really expect you to be single
handedly fixing or rewriting merge-recursive. "In the meantime" patch is
not about attempting to "fix" anything deep inside the guts of it; it is
merely to die() with messages in a function that returned NULL when the
caller never expected to see NULL and caused segfault.
> But in the long run, I think that it gets tiring to chase all kinds of
> weird interactions between unpack_trees(), the rename detection and the
> recursive merge.
I don't think there is any interaction; as Tim Olsen reported, "resolve"
that uses the same unpack_trees() merges the trees just fine. The bug
seems to be all inside merge_recursive().
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 2:35 ` Remove diff machinery dependency from read-cache Nicolas Pitre
2010-01-22 2:44 ` Linus Torvalds
@ 2010-01-22 3:56 ` Junio C Hamano
2010-01-22 4:21 ` Linus Torvalds
2010-01-22 4:31 ` Linus Torvalds
2 siblings, 1 reply; 23+ messages in thread
From: Junio C Hamano @ 2010-01-22 3:56 UTC (permalink / raw)
To: Nicolas Pitre
Cc: Junio C Hamano, Linus Torvalds, Shawn O. Pearce, Git Mailing List
Nicolas Pitre <nico@fluxnic.net> writes:
> I do use it, but for developing/debugging pack stuff. I don't suggest
> removing it, but I don't think making it a built-in has value either.
I thought people _might_ have used it for satistics purposes, but it
appears that the command doesn't even give in-pack size of objects nor
delta chain length, so probably anybody doing pack statistics would be
using "verify-pack -v" and wouldn't mind if it became test-show-index.
> So I really think that Linus' patch (which is missing hex.c btw) is a
> good thing to do, even if only for the cleanup value.
>
> Then, git-show-index could probably become test-show-index and no longer
> leave the build directory.
Yeah, I think that is a sensible long term plan, too.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-21 19:37 Remove diff machinery dependency from read-cache Linus Torvalds
2010-01-21 20:07 ` Junio C Hamano
@ 2010-01-22 3:58 ` Linus Torvalds
2010-01-23 6:31 ` Brian Campbell
2 siblings, 0 replies; 23+ messages in thread
From: Linus Torvalds @ 2010-01-22 3:58 UTC (permalink / raw)
To: Junio C Hamano, Git Mailing List
On Thu, 21 Jan 2010, Linus Torvalds wrote:
>
> It's not just that one file either. I get:
>
> [torvalds@nehalem git]$ du -s /home/torvalds/libexec/git-core
> 45640 /home/torvalds/libexec/git-core (before)
> 33508 /home/torvalds/libexec/git-core (after)
>
> so we're talking 12MB of diskspace here.
Btw, with the few built-in patches I've sent, it's now
[torvalds@nehalem git]$ du -s /home/torvalds/libexec/git-core
27876 /home/torvalds/libexec/git-core
so they're worth about 5.5M of disk-space.
Of course, without debugging and with -Os, the difference is much smaller,
and libexec ends up being "just" 8.6MB in size. There are still a number
of trivial programs that could be made builtin.
Optimally, I suspect just things like 'git-daemon' and the remote helpers
would be actual separate binaries.
Linus
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 3:56 ` Junio C Hamano
@ 2010-01-22 4:21 ` Linus Torvalds
0 siblings, 0 replies; 23+ messages in thread
From: Linus Torvalds @ 2010-01-22 4:21 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Nicolas Pitre, Shawn O. Pearce, Git Mailing List
On Thu, 21 Jan 2010, Junio C Hamano wrote:
> Nicolas Pitre <nico@fluxnic.net> writes:
>
> > I do use it, but for developing/debugging pack stuff. I don't suggest
> > removing it, but I don't think making it a built-in has value either.
>
> I thought people _might_ have used it for satistics purposes, but it
> appears that the command doesn't even give in-pack size of objects nor
> delta chain length, so probably anybody doing pack statistics would be
> using "verify-pack -v" and wouldn't mind if it became test-show-index.
>
> > So I really think that Linus' patch (which is missing hex.c btw) is a
> > good thing to do, even if only for the cleanup value.
> >
> > Then, git-show-index could probably become test-show-index and no longer
> > leave the build directory.
>
> Yeah, I think that is a sensible long term plan, too.
Note that there are other totally trivial git programs like 'git-var' that
have exactly the same issue as 'git-show-index'.
Same details: it doesn't really want any diff machinery, doesn't want any
git object handling, but can't avoid it because it uses xmalloc (through
environment.c and config.c etc), so a program that _should_ be pretty
trivially small again ends up being 200+kB in size even without debug
info (and almost a megabyte with it).
So here's another trivial builtin-ification patch.
Linus
---
Makefile | 2 +-
var.c => builtin-var.c | 4 +---
builtin.h | 1 +
git.c | 1 +
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Makefile b/Makefile
index f9e4aa3..398b5fb 100644
--- a/Makefile
+++ b/Makefile
@@ -396,7 +396,6 @@ PROGRAMS += git-patch-id$X
PROGRAMS += git-shell$X
PROGRAMS += git-unpack-file$X
PROGRAMS += git-upload-pack$X
-PROGRAMS += git-var$X
PROGRAMS += git-http-backend$X
# List built-in command $C whose implementation cmd_$C() is not in
@@ -703,6 +702,7 @@ BUILTIN_OBJS += builtin-update-index.o
BUILTIN_OBJS += builtin-update-ref.o
BUILTIN_OBJS += builtin-update-server-info.o
BUILTIN_OBJS += builtin-upload-archive.o
+BUILTIN_OBJS += builtin-var.o
BUILTIN_OBJS += builtin-verify-pack.o
BUILTIN_OBJS += builtin-verify-tag.o
BUILTIN_OBJS += builtin-write-tree.o
diff --git a/var.c b/builtin-var.c
similarity index 96%
rename from var.c
rename to builtin-var.c
index d9892f8..2280518 100644
--- a/var.c
+++ b/builtin-var.c
@@ -72,7 +72,7 @@ static int show_config(const char *var, const char *value, void *cb)
return git_default_config(var, value, cb);
}
-int main(int argc, char **argv)
+int cmd_var(int argc, const char **argv, const char *prefix)
{
const char *val;
int nongit;
@@ -80,8 +80,6 @@ int main(int argc, char **argv)
usage(var_usage);
}
- git_extract_argv0_path(argv[0]);
-
setup_git_directory_gently(&nongit);
val = NULL;
diff --git a/builtin.h b/builtin.h
index 3aa6b6c..0c9c396 100644
--- a/builtin.h
+++ b/builtin.h
@@ -107,6 +107,7 @@ extern int cmd_update_ref(int argc, const char **argv, const char *prefix);
extern int cmd_update_server_info(int argc, const char **argv, const char *prefix);
extern int cmd_upload_archive(int argc, const char **argv, const char *prefix);
extern int cmd_upload_tar(int argc, const char **argv, const char *prefix);
+extern int cmd_var(int argc, const char **argv, const char *prefix);
extern int cmd_verify_tag(int argc, const char **argv, const char *prefix);
extern int cmd_version(int argc, const char **argv, const char *prefix);
extern int cmd_whatchanged(int argc, const char **argv, const char *prefix);
diff --git a/git.c b/git.c
index a952663..09d3272 100644
--- a/git.c
+++ b/git.c
@@ -373,6 +373,7 @@ static void handle_internal_command(int argc, const char **argv)
{ "update-ref", cmd_update_ref, RUN_SETUP },
{ "update-server-info", cmd_update_server_info, RUN_SETUP },
{ "upload-archive", cmd_upload_archive },
+ { "var", cmd_var },
{ "verify-tag", cmd_verify_tag, RUN_SETUP },
{ "version", cmd_version },
{ "whatchanged", cmd_whatchanged, RUN_SETUP | USE_PAGER },
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 2:35 ` Remove diff machinery dependency from read-cache Nicolas Pitre
2010-01-22 2:44 ` Linus Torvalds
2010-01-22 3:56 ` Junio C Hamano
@ 2010-01-22 4:31 ` Linus Torvalds
2 siblings, 0 replies; 23+ messages in thread
From: Linus Torvalds @ 2010-01-22 4:31 UTC (permalink / raw)
To: Nicolas Pitre; +Cc: Junio C Hamano, Shawn O. Pearce, Git Mailing List
On Thu, 21 Jan 2010, Nicolas Pitre wrote:
>
> So I really think that Linus' patch (which is missing hex.c btw) is a
> good thing to do, even if only for the cleanup value.
Btw, it looks like the separate hex.c would fix not just git-show-index
(together with de-xmalloc), but also make git-patch-id shrink down. Except
git-patch-id for some reason does git_extract_argv0_path(), which brings
in exec_cmd.o, which brings in strbuf, and xmalloc, and now it's all the
same old pain again.
So rather than try to solve it all (xmalloc in particular is pretty
hairy), here's another patch.
Linus
---
Makefile | 2 +-
patch-id.c => builtin-patch-id.c | 4 +---
builtin.h | 1 +
git.c | 1 +
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Makefile b/Makefile
index 398b5fb..5b614e4 100644
--- a/Makefile
+++ b/Makefile
@@ -392,7 +392,6 @@ PROGRAMS += git-index-pack$X
PROGRAMS += git-merge-index$X
PROGRAMS += git-mktag$X
PROGRAMS += git-pack-redundant$X
-PROGRAMS += git-patch-id$X
PROGRAMS += git-shell$X
PROGRAMS += git-unpack-file$X
PROGRAMS += git-upload-pack$X
@@ -674,6 +673,7 @@ BUILTIN_OBJS += builtin-mv.o
BUILTIN_OBJS += builtin-name-rev.o
BUILTIN_OBJS += builtin-pack-objects.o
BUILTIN_OBJS += builtin-pack-refs.o
+BUILTIN_OBJS += builtin-patch-id.o
BUILTIN_OBJS += builtin-prune-packed.o
BUILTIN_OBJS += builtin-prune.o
BUILTIN_OBJS += builtin-push.o
diff --git a/patch-id.c b/builtin-patch-id.c
similarity index 95%
rename from patch-id.c
rename to builtin-patch-id.c
index 0df4cb0..af0911e 100644
--- a/patch-id.c
+++ b/builtin-patch-id.c
@@ -75,13 +75,11 @@ static void generate_id_list(void)
static const char patch_id_usage[] = "git patch-id < patch";
-int main(int argc, char **argv)
+int cmd_patch_id(int argc, const char **argv, const char *prefix)
{
if (argc != 1)
usage(patch_id_usage);
- git_extract_argv0_path(argv[0]);
-
generate_id_list();
return 0;
}
diff --git a/builtin.h b/builtin.h
index 0c9c396..ab723f8 100644
--- a/builtin.h
+++ b/builtin.h
@@ -76,6 +76,7 @@ extern int cmd_mktree(int argc, const char **argv, const char *prefix);
extern int cmd_mv(int argc, const char **argv, const char *prefix);
extern int cmd_name_rev(int argc, const char **argv, const char *prefix);
extern int cmd_pack_objects(int argc, const char **argv, const char *prefix);
+extern int cmd_patch_id(int argc, const char **argv, const char *prefix);
extern int cmd_pickaxe(int argc, const char **argv, const char *prefix);
extern int cmd_prune(int argc, const char **argv, const char *prefix);
extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);
diff --git a/git.c b/git.c
index 09d3272..e38f201 100644
--- a/git.c
+++ b/git.c
@@ -341,6 +341,7 @@ static void handle_internal_command(int argc, const char **argv)
{ "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
{ "name-rev", cmd_name_rev, RUN_SETUP },
{ "pack-objects", cmd_pack_objects, RUN_SETUP },
+ { "patch-id", cmd_patch_id },
{ "peek-remote", cmd_ls_remote },
{ "pickaxe", cmd_blame, RUN_SETUP },
{ "prune", cmd_prune, RUN_SETUP },
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-22 2:25 ` Linus Torvalds
2010-01-22 3:50 ` Linus Torvalds
@ 2010-01-22 8:43 ` Johannes Sixt
2010-01-22 11:47 ` [PATCH] merge-tree: remove unnecessary call of git_extract_argv0_path Johannes Sixt
1 sibling, 1 reply; 23+ messages in thread
From: Johannes Sixt @ 2010-01-22 8:43 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Junio C Hamano, Shawn O. Pearce, Git Mailing List
Linus Torvalds schrieb:
> @@ -347,8 +347,6 @@ int main(int argc, char **argv)
>
> git_extract_argv0_path(argv[0]);
This line must go away as well.
> - setup_git_directory();
> -
-- Hannes
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH] merge-tree: remove unnecessary call of git_extract_argv0_path
2010-01-22 8:43 ` Johannes Sixt
@ 2010-01-22 11:47 ` Johannes Sixt
2010-01-22 16:40 ` Linus Torvalds
0 siblings, 1 reply; 23+ messages in thread
From: Johannes Sixt @ 2010-01-22 11:47 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Junio C Hamano, Shawn O. Pearce, git, Johannes Sixt
This call should have been removed when the utility was made a builtin by
907a7cb.
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
builtin-merge-tree.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/builtin-merge-tree.c b/builtin-merge-tree.c
index 8e16c3e..a4a4f2c 100644
--- a/builtin-merge-tree.c
+++ b/builtin-merge-tree.c
@@ -345,8 +345,6 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
if (argc != 4)
usage(merge_tree_usage);
- git_extract_argv0_path(argv[0]);
-
buf1 = get_tree_descriptor(t+0, argv[1]);
buf2 = get_tree_descriptor(t+1, argv[2]);
buf3 = get_tree_descriptor(t+2, argv[3]);
--
1.6.6.1.372.g084d
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH] merge-tree: remove unnecessary call of git_extract_argv0_path
2010-01-22 11:47 ` [PATCH] merge-tree: remove unnecessary call of git_extract_argv0_path Johannes Sixt
@ 2010-01-22 16:40 ` Linus Torvalds
0 siblings, 0 replies; 23+ messages in thread
From: Linus Torvalds @ 2010-01-22 16:40 UTC (permalink / raw)
To: Johannes Sixt; +Cc: Junio C Hamano, Shawn O. Pearce, git
On Fri, 22 Jan 2010, Johannes Sixt wrote:
>
> This call should have been removed when the utility was made a builtin by
> 907a7cb.
Ack.
Linus
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: Remove diff machinery dependency from read-cache
2010-01-21 19:37 Remove diff machinery dependency from read-cache Linus Torvalds
2010-01-21 20:07 ` Junio C Hamano
2010-01-22 3:58 ` Linus Torvalds
@ 2010-01-23 6:31 ` Brian Campbell
2 siblings, 0 replies; 23+ messages in thread
From: Brian Campbell @ 2010-01-23 6:31 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Junio C Hamano, Git Mailing List
On Jan 21, 2010, at 2:37 PM, Linus Torvalds wrote:
> ---
> builtin-add.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> read-cache.c | 78 ---------------------------------------------------------
> 2 files changed, 76 insertions(+), 78 deletions(-)
>
> diff --git a/builtin-add.c b/builtin-add.c
> index cb6e590..2705f8d 100644
I've recently tried building "master" from git://git.kernel.org/pub/scm/git/git.git, and got the following error:
$ make
...snip...
LINK git-fast-import
Undefined symbols:
"_git_mailmap_file", referenced from:
_git_default_config in libgit.a(config.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [git-fast-import] Error 1
When I bisect, I find this commit to blame:
$ git bisect start master v1.6.6.1
Bisecting: 197 revisions left to test after this (roughly 8 steps)
[f8eb50f60b5c8efda3529fcf89517080c686ce0b] Merge branch 'jh/commit-status'
$ git bisect run make -j2
running make -j2
GIT_VERSION = 1.6.6.240.gf8eb5
...snip...
fb7d3f32b283a3847e6f151a06794abd14ffd81b is the first bad commit
commit fb7d3f32b283a3847e6f151a06794abd14ffd81b
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: Thu Jan 21 11:37:38 2010 -0800
I also verified that it fails from with "make clean; make", so a dirty tree or -j2 aren't to blame. I'm not terribly familiar with the code base, so I'm a bit puzzled about why this commit would have cause the error that it does; I don't see any obvious connection between add_files_to_cache() and git_mailmap_file.
Can anyone explain why I'd be seeing such an error? Is this a problem on my end?
$ uname -a
Darwin erlang.local 10.2.0 Darwin Kernel Version 10.2.0: Tue Nov 3 10:37:10 PST 2009; root:xnu-1486.2.11~1/RELEASE_I386 i386
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646) (dot 1)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2010-01-23 6:32 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-21 19:37 Remove diff machinery dependency from read-cache Linus Torvalds
2010-01-21 20:07 ` Junio C Hamano
2010-01-21 20:15 ` Linus Torvalds
2010-01-21 22:18 ` Linus Torvalds
2010-01-21 23:25 ` Linus Torvalds
2010-01-22 0:45 ` Junio C Hamano
2010-01-22 0:59 ` Johannes Schindelin
2010-01-22 1:01 ` Junio C Hamano
2010-01-22 1:43 ` Johannes Schindelin
2010-01-22 3:50 ` Junio C Hamano
2010-01-22 2:20 ` Linus Torvalds
2010-01-22 2:25 ` Linus Torvalds
2010-01-22 3:50 ` Linus Torvalds
2010-01-22 8:43 ` Johannes Sixt
2010-01-22 11:47 ` [PATCH] merge-tree: remove unnecessary call of git_extract_argv0_path Johannes Sixt
2010-01-22 16:40 ` Linus Torvalds
2010-01-22 2:35 ` Remove diff machinery dependency from read-cache Nicolas Pitre
2010-01-22 2:44 ` Linus Torvalds
2010-01-22 3:56 ` Junio C Hamano
2010-01-22 4:21 ` Linus Torvalds
2010-01-22 4:31 ` Linus Torvalds
2010-01-22 3:58 ` Linus Torvalds
2010-01-23 6:31 ` Brian Campbell
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).