threads / discuss / 22715

[RFD] Deepen the git directory structure a bit.

Subject: [RFD] Deepen the git directory structure a bit.

## tl;dr

11 messages between Feb 18, 2010 and Feb 27, 2010.

replies: 10people: 6as markdown or json

Linus Torvalds· Feb 18, 2010, 18:36 UTC · lore

Ok, this is just a request-for-discussion. I'm trying out a patch like this, and I think it's a step in the right direction. The git directory structure is _very_ flat, and currently in a fully built git tree, the top-level directory has something like 750 files in it.

After this, it still has a ton of files, but it has shrunk to ~575 files instead, and at least for my (admittedly somewhat odd) setup, that actually matters for auto-completion etc.

I think this coul probably be done differently (I'm not proud of that ugly '-I. -Ibuiltin' addition to the CFLAGS, for example), and I think there are _other_ things we could also try to do to move files into subdirectories, but this was a fairly easy thing to basically script.

What do people think?
			Linus
---
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Thu, 18 Feb 2010 10:11:32 -0800
Subject: [PATCH] Move 'builtin-*' into a 'builtin/' subdirectory

This shrinks the top-level directory a bit, and makes it much more pleasant to use auto-completion on the thing. Instead of

	[torvalds@nehalem git]$ em buil<tab>
	Display all 180 possibilities? (y or n)
	[torvalds@nehalem git]$ em builtin-sh
	builtin-shortlog.c     builtin-show-branch.c  builtin-show-ref.c
	builtin-shortlog.o     builtin-show-branch.o  builtin-show-ref.o
	[torvalds@nehalem git]$ em builtin-shor<tab>
	builtin-shortlog.c  builtin-shortlog.o
	[torvalds@nehalem git]$ em builtin-shortlog.c
you get
	[torvalds@nehalem git]$ em buil<tab>		[type]
	[torvalds@nehalem git]$ em builtin/		[auto-completes to]
	[torvalds@nehalem git]$ em builtin/sh<tab>	[type]
	shortlog.c     shortlog.o     show-branch.c  show-branch.o  show-ref.c     show-ref.o
	[torvalds@nehalem git]$ em builtin/sho		[auto-completes to]
	[torvalds@nehalem git]$ em builtin/shor<tab>	[type]
	shortlog.c  shortlog.o
	[torvalds@nehalem git]$ em builtin/shortlog.c

which doesn't seem all that different, but not having that annoying break in "Display all 180 possibilities?" is quite a relief.

NOTE! If you do this in a clean tree (no object files etc), or using an editor that has auto-completion rules that ignores '*.o' files, you won't see that annoying 'Display all 180 possibilities?' message - it will just show the choices instead. I think bash has some cut-off around 100 choices or something.

So the reason I see this is that I'm using an odd editory, and thus don't have the rules to cut down on auto-completion. But you can simulate that by using 'ls' instead, or something similar. And you can tell that there are fewer files in the top directory.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
---
 Makefile                                           |  194 ++++++++++----------
 builtin-add.c => builtin/add.c                     |    0
 builtin-annotate.c => builtin/annotate.c           |    0
 builtin-apply.c => builtin/apply.c                 |    0
 builtin-archive.c => builtin/archive.c             |    0
 .../bisect--helper.c                               |    0
 builtin-blame.c => builtin/blame.c                 |    0
 builtin-branch.c => builtin/branch.c               |    0
 builtin.h => builtin/builtin.h                     |    0
 builtin-bundle.c => builtin/bundle.c               |    0
 builtin-cat-file.c => builtin/cat-file.c           |    0
 builtin-check-attr.c => builtin/check-attr.c       |    0
 .../check-ref-format.c                             |    0
 .../checkout-index.c                               |    0
 builtin-checkout.c => builtin/checkout.c           |    0
 builtin-clean.c => builtin/clean.c                 |    0
 builtin-clone.c => builtin/clone.c                 |    0
 builtin-commit-tree.c => builtin/commit-tree.c     |    0
 builtin-commit.c => builtin/commit.c               |    0
 builtin-config.c => builtin/config.c               |    0
 builtin-count-objects.c => builtin/count-objects.c |    0
 builtin-describe.c => builtin/describe.c           |    0
 builtin-diff-files.c => builtin/diff-files.c       |    0
 builtin-diff-index.c => builtin/diff-index.c       |    0
 builtin-diff-tree.c => builtin/diff-tree.c         |    0
 builtin-diff.c => builtin/diff.c                   |    0
 builtin-fast-export.c => builtin/fast-export.c     |    0
 builtin-fetch-pack.c => builtin/fetch-pack.c       |    0
 builtin-fetch.c => builtin/fetch.c                 |    0
 builtin-fmt-merge-msg.c => builtin/fmt-merge-msg.c |    0
 builtin-for-each-ref.c => builtin/for-each-ref.c   |    0
 builtin-fsck.c => builtin/fsck.c                   |    0
 builtin-gc.c => builtin/gc.c                       |    0
 builtin-grep.c => builtin/grep.c                   |    0
 builtin-hash-object.c => builtin/hash-object.c     |    0
 builtin-help.c => builtin/help.c                   |    0
 builtin-index-pack.c => builtin/index-pack.c       |    0
 builtin-init-db.c => builtin/init-db.c             |    0
 builtin-log.c => builtin/log.c                     |    0
 builtin-ls-files.c => builtin/ls-files.c           |    0
 builtin-ls-remote.c => builtin/ls-remote.c         |    0
 builtin-ls-tree.c => builtin/ls-tree.c             |    0
 builtin-mailinfo.c => builtin/mailinfo.c           |    0
 builtin-mailsplit.c => builtin/mailsplit.c         |    0
 builtin-merge-base.c => builtin/merge-base.c       |    0
 builtin-merge-file.c => builtin/merge-file.c       |    0
 builtin-merge-index.c => builtin/merge-index.c     |    0
 builtin-merge-ours.c => builtin/merge-ours.c       |    0
 .../merge-recursive.c                              |    0
 builtin-merge-tree.c => builtin/merge-tree.c       |    0
 builtin-merge.c => builtin/merge.c                 |    0
 builtin-mktag.c => builtin/mktag.c                 |    0
 builtin-mktree.c => builtin/mktree.c               |    0
 builtin-mv.c => builtin/mv.c                       |    0
 builtin-name-rev.c => builtin/name-rev.c           |    0
 builtin-pack-objects.c => builtin/pack-objects.c   |    0
 .../pack-redundant.c                               |    0
 builtin-pack-refs.c => builtin/pack-refs.c         |    0
 builtin-patch-id.c => builtin/patch-id.c           |    0
 builtin-prune-packed.c => builtin/prune-packed.c   |    0
 builtin-prune.c => builtin/prune.c                 |    0
 builtin-push.c => builtin/push.c                   |    0
 builtin-read-tree.c => builtin/read-tree.c         |    0
 builtin-receive-pack.c => builtin/receive-pack.c   |    0
 builtin-reflog.c => builtin/reflog.c               |    0
 builtin-remote.c => builtin/remote.c               |    0
 builtin-replace.c => builtin/replace.c             |    0
 builtin-rerere.c => builtin/rerere.c               |    0
 builtin-reset.c => builtin/reset.c                 |    0
 builtin-rev-list.c => builtin/rev-list.c           |    0
 builtin-rev-parse.c => builtin/rev-parse.c         |    0
 builtin-revert.c => builtin/revert.c               |    0
 builtin-rm.c => builtin/rm.c                       |    0
 builtin-send-pack.c => builtin/send-pack.c         |    0
 builtin-shortlog.c => builtin/shortlog.c           |    0
 builtin-show-branch.c => builtin/show-branch.c     |    0
 builtin-show-ref.c => builtin/show-ref.c           |    0
 builtin-stripspace.c => builtin/stripspace.c       |    0
 builtin-symbolic-ref.c => builtin/symbolic-ref.c   |    0
 builtin-tag.c => builtin/tag.c                     |    0
 builtin-tar-tree.c => builtin/tar-tree.c           |    0
 builtin-unpack-file.c => builtin/unpack-file.c     |    0
 .../unpack-objects.c                               |    0
 builtin-update-index.c => builtin/update-index.c   |    0
 builtin-update-ref.c => builtin/update-ref.c       |    0
 .../update-server-info.c                           |    0
 .../upload-archive.c                               |    0
 builtin-var.c => builtin/var.c                     |    0
 builtin-verify-pack.c => builtin/verify-pack.c     |    0
 builtin-verify-tag.c => builtin/verify-tag.c       |    0
 builtin-write-tree.c => builtin/write-tree.c       |    0
 91 files changed, 97 insertions(+), 97 deletions(-)
 rename builtin-add.c => builtin/add.c (100%)
 rename builtin-annotate.c => builtin/annotate.c (100%)
 rename builtin-apply.c => builtin/apply.c (100%)
 rename builtin-archive.c => builtin/archive.c (100%)
 rename builtin-bisect--helper.c => builtin/bisect--helper.c (100%)
 rename builtin-blame.c => builtin/blame.c (100%)
 rename builtin-branch.c => builtin/branch.c (100%)
 rename builtin.h => builtin/builtin.h (100%)
 rename builtin-bundle.c => builtin/bundle.c (100%)
 rename builtin-cat-file.c => builtin/cat-file.c (100%)
 rename builtin-check-attr.c => builtin/check-attr.c (100%)
 rename builtin-check-ref-format.c => builtin/check-ref-format.c (100%)
 rename builtin-checkout-index.c => builtin/checkout-index.c (100%)
 rename builtin-checkout.c => builtin/checkout.c (100%)
 rename builtin-clean.c => builtin/clean.c (100%)
 rename builtin-clone.c => builtin/clone.c (100%)
 rename builtin-commit-tree.c => builtin/commit-tree.c (100%)
 rename builtin-commit.c => builtin/commit.c (100%)
 rename builtin-config.c => builtin/config.c (100%)
 rename builtin-count-objects.c => builtin/count-objects.c (100%)
 rename builtin-describe.c => builtin/describe.c (100%)
 rename builtin-diff-files.c => builtin/diff-files.c (100%)
 rename builtin-diff-index.c => builtin/diff-index.c (100%)
 rename builtin-diff-tree.c => builtin/diff-tree.c (100%)
 rename builtin-diff.c => builtin/diff.c (100%)
 rename builtin-fast-export.c => builtin/fast-export.c (100%)
 rename builtin-fetch-pack.c => builtin/fetch-pack.c (100%)
 rename builtin-fetch.c => builtin/fetch.c (100%)
 rename builtin-fmt-merge-msg.c => builtin/fmt-merge-msg.c (100%)
 rename builtin-for-each-ref.c => builtin/for-each-ref.c (100%)
 rename builtin-fsck.c => builtin/fsck.c (100%)
 rename builtin-gc.c => builtin/gc.c (100%)
 rename builtin-grep.c => builtin/grep.c (100%)
 rename builtin-hash-object.c => builtin/hash-object.c (100%)
 rename builtin-help.c => builtin/help.c (100%)
 rename builtin-index-pack.c => builtin/index-pack.c (100%)
 rename builtin-init-db.c => builtin/init-db.c (100%)
 rename builtin-log.c => builtin/log.c (100%)
 rename builtin-ls-files.c => builtin/ls-files.c (100%)
 rename builtin-ls-remote.c => builtin/ls-remote.c (100%)
 rename builtin-ls-tree.c => builtin/ls-tree.c (100%)
 rename builtin-mailinfo.c => builtin/mailinfo.c (100%)
 rename builtin-mailsplit.c => builtin/mailsplit.c (100%)
 rename builtin-merge-base.c => builtin/merge-base.c (100%)
 rename builtin-merge-file.c => builtin/merge-file.c (100%)
 rename builtin-merge-index.c => builtin/merge-index.c (100%)
 rename builtin-merge-ours.c => builtin/merge-ours.c (100%)
 rename builtin-merge-recursive.c => builtin/merge-recursive.c (100%)
 rename builtin-merge-tree.c => builtin/merge-tree.c (100%)
 rename builtin-merge.c => builtin/merge.c (100%)
 rename builtin-mktag.c => builtin/mktag.c (100%)
 rename builtin-mktree.c => builtin/mktree.c (100%)
 rename builtin-mv.c => builtin/mv.c (100%)
 rename builtin-name-rev.c => builtin/name-rev.c (100%)
 rename builtin-pack-objects.c => builtin/pack-objects.c (100%)
 rename builtin-pack-redundant.c => builtin/pack-redundant.c (100%)
 rename builtin-pack-refs.c => builtin/pack-refs.c (100%)
 rename builtin-patch-id.c => builtin/patch-id.c (100%)
 rename builtin-prune-packed.c => builtin/prune-packed.c (100%)
 rename builtin-prune.c => builtin/prune.c (100%)
 rename builtin-push.c => builtin/push.c (100%)
 rename builtin-read-tree.c => builtin/read-tree.c (100%)
 rename builtin-receive-pack.c => builtin/receive-pack.c (100%)
 rename builtin-reflog.c => builtin/reflog.c (100%)
 rename builtin-remote.c => builtin/remote.c (100%)
 rename builtin-replace.c => builtin/replace.c (100%)
 rename builtin-rerere.c => builtin/rerere.c (100%)
 rename builtin-reset.c => builtin/reset.c (100%)
 rename builtin-rev-list.c => builtin/rev-list.c (100%)
 rename builtin-rev-parse.c => builtin/rev-parse.c (100%)
 rename builtin-revert.c => builtin/revert.c (100%)
 rename builtin-rm.c => builtin/rm.c (100%)
 rename builtin-send-pack.c => builtin/send-pack.c (100%)
 rename builtin-shortlog.c => builtin/shortlog.c (100%)
 rename builtin-show-branch.c => builtin/show-branch.c (100%)
 rename builtin-show-ref.c => builtin/show-ref.c (100%)
 rename builtin-stripspace.c => builtin/stripspace.c (100%)
 rename builtin-symbolic-ref.c => builtin/symbolic-ref.c (100%)
 rename builtin-tag.c => builtin/tag.c (100%)
 rename builtin-tar-tree.c => builtin/tar-tree.c (100%)
 rename builtin-unpack-file.c => builtin/unpack-file.c (100%)
 rename builtin-unpack-objects.c => builtin/unpack-objects.c (100%)
 rename builtin-update-index.c => builtin/update-index.c (100%)
 rename builtin-update-ref.c => builtin/update-ref.c (100%)
 rename builtin-update-server-info.c => builtin/update-server-info.c (100%)
 rename builtin-upload-archive.c => builtin/upload-archive.c (100%)
 rename builtin-var.c => builtin/var.c (100%)
 rename builtin-verify-pack.c => builtin/verify-pack.c (100%)
 rename builtin-verify-tag.c => builtin/verify-tag.c (100%)
 rename builtin-write-tree.c => builtin/write-tree.c (100%)
diff --git a/Makefile b/Makefile
index 7bf2fca..f023f9b 100644
--- a/Makefile
+++ b/Makefile
@@ -301,7 +301,7 @@ SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
 # Those must not be GNU-specific; they are shared with perl/ which may
 # be built by a different compiler. (Note that this is an artifact now
 # but it still might be nice to keep that distinction.)
-BASIC_CFLAGS =
+BASIC_CFLAGS = -I. -Ibuiltin
 BASIC_LDFLAGS =
 
 # Guard against environment variables
@@ -368,8 +368,8 @@ PROGRAMS += git-upload-pack$X
 PROGRAMS += git-http-backend$X
 
 # List built-in command $C whose implementation cmd_$C() is not in
-# builtin-$C.o but is linked in as part of some other command.
-BUILT_INS += $(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS))
+# builtin/$C.o but is linked in as part of some other command.
+BUILT_INS += $(patsubst builtin/%.o,git-%$X,$(BUILTIN_OBJS))
 
 BUILT_INS += git-cherry$X
 BUILT_INS += git-cherry-pick$X
@@ -422,7 +422,7 @@ LIB_H += advice.h
 LIB_H += archive.h
 LIB_H += attr.h
 LIB_H += blob.h
-LIB_H += builtin.h
+LIB_H += builtin/builtin.h
 LIB_H += cache.h
 LIB_H += cache-tree.h
 LIB_H += commit.h
@@ -592,95 +592,95 @@ LIB_OBJS += ws.o
 LIB_OBJS += wt-status.o
 LIB_OBJS += xdiff-interface.o
 
-BUILTIN_OBJS += builtin-add.o
-BUILTIN_OBJS += builtin-annotate.o
-BUILTIN_OBJS += builtin-apply.o
-BUILTIN_OBJS += builtin-archive.o
-BUILTIN_OBJS += builtin-bisect--helper.o
-BUILTIN_OBJS += builtin-blame.o
-BUILTIN_OBJS += builtin-branch.o
-BUILTIN_OBJS += builtin-bundle.o
-BUILTIN_OBJS += builtin-cat-file.o
-BUILTIN_OBJS += builtin-check-attr.o
-BUILTIN_OBJS += builtin-check-ref-format.o
-BUILTIN_OBJS += builtin-checkout-index.o
-BUILTIN_OBJS += builtin-checkout.o
-BUILTIN_OBJS += builtin-clean.o
-BUILTIN_OBJS += builtin-clone.o
-BUILTIN_OBJS += builtin-commit-tree.o
-BUILTIN_OBJS += builtin-commit.o
-BUILTIN_OBJS += builtin-config.o
-BUILTIN_OBJS += builtin-count-objects.o
-BUILTIN_OBJS += builtin-describe.o
-BUILTIN_OBJS += builtin-diff-files.o
-BUILTIN_OBJS += builtin-diff-index.o
-BUILTIN_OBJS += builtin-diff-tree.o
-BUILTIN_OBJS += builtin-diff.o
-BUILTIN_OBJS += builtin-fast-export.o
-BUILTIN_OBJS += builtin-fetch-pack.o
-BUILTIN_OBJS += builtin-fetch.o
-BUILTIN_OBJS += builtin-fmt-merge-msg.o
-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-index-pack.o
-BUILTIN_OBJS += builtin-init-db.o
-BUILTIN_OBJS += builtin-log.o
-BUILTIN_OBJS += builtin-ls-files.o
-BUILTIN_OBJS += builtin-ls-remote.o
-BUILTIN_OBJS += builtin-ls-tree.o
-BUILTIN_OBJS += builtin-mailinfo.o
-BUILTIN_OBJS += builtin-mailsplit.o
-BUILTIN_OBJS += builtin-merge.o
-BUILTIN_OBJS += builtin-merge-base.o
-BUILTIN_OBJS += builtin-merge-file.o
-BUILTIN_OBJS += builtin-merge-index.o
-BUILTIN_OBJS += builtin-merge-ours.o
-BUILTIN_OBJS += builtin-merge-recursive.o
-BUILTIN_OBJS += builtin-merge-tree.o
-BUILTIN_OBJS += builtin-mktag.o
-BUILTIN_OBJS += builtin-mktree.o
-BUILTIN_OBJS += builtin-mv.o
-BUILTIN_OBJS += builtin-name-rev.o
-BUILTIN_OBJS += builtin-pack-objects.o
-BUILTIN_OBJS += builtin-pack-redundant.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
-BUILTIN_OBJS += builtin-read-tree.o
-BUILTIN_OBJS += builtin-receive-pack.o
-BUILTIN_OBJS += builtin-reflog.o
-BUILTIN_OBJS += builtin-remote.o
-BUILTIN_OBJS += builtin-replace.o
-BUILTIN_OBJS += builtin-rerere.o
-BUILTIN_OBJS += builtin-reset.o
-BUILTIN_OBJS += builtin-rev-list.o
-BUILTIN_OBJS += builtin-rev-parse.o
-BUILTIN_OBJS += builtin-revert.o
-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-ref.o
-BUILTIN_OBJS += builtin-stripspace.o
-BUILTIN_OBJS += builtin-symbolic-ref.o
-BUILTIN_OBJS += builtin-tag.o
-BUILTIN_OBJS += builtin-tar-tree.o
-BUILTIN_OBJS += builtin-unpack-file.o
-BUILTIN_OBJS += builtin-unpack-objects.o
-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
+BUILTIN_OBJS += builtin/add.o
+BUILTIN_OBJS += builtin/annotate.o
+BUILTIN_OBJS += builtin/apply.o
+BUILTIN_OBJS += builtin/archive.o
+BUILTIN_OBJS += builtin/bisect--helper.o
+BUILTIN_OBJS += builtin/blame.o
+BUILTIN_OBJS += builtin/branch.o
+BUILTIN_OBJS += builtin/bundle.o
+BUILTIN_OBJS += builtin/cat-file.o
+BUILTIN_OBJS += builtin/check-attr.o
+BUILTIN_OBJS += builtin/check-ref-format.o
+BUILTIN_OBJS += builtin/checkout-index.o
+BUILTIN_OBJS += builtin/checkout.o
+BUILTIN_OBJS += builtin/clean.o
+BUILTIN_OBJS += builtin/clone.o
+BUILTIN_OBJS += builtin/commit-tree.o
+BUILTIN_OBJS += builtin/commit.o
+BUILTIN_OBJS += builtin/config.o
+BUILTIN_OBJS += builtin/count-objects.o
+BUILTIN_OBJS += builtin/describe.o
+BUILTIN_OBJS += builtin/diff-files.o
+BUILTIN_OBJS += builtin/diff-index.o
+BUILTIN_OBJS += builtin/diff-tree.o
+BUILTIN_OBJS += builtin/diff.o
+BUILTIN_OBJS += builtin/fast-export.o
+BUILTIN_OBJS += builtin/fetch-pack.o
+BUILTIN_OBJS += builtin/fetch.o
+BUILTIN_OBJS += builtin/fmt-merge-msg.o
+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/index-pack.o
+BUILTIN_OBJS += builtin/init-db.o
+BUILTIN_OBJS += builtin/log.o
+BUILTIN_OBJS += builtin/ls-files.o
+BUILTIN_OBJS += builtin/ls-remote.o
+BUILTIN_OBJS += builtin/ls-tree.o
+BUILTIN_OBJS += builtin/mailinfo.o
+BUILTIN_OBJS += builtin/mailsplit.o
+BUILTIN_OBJS += builtin/merge.o
+BUILTIN_OBJS += builtin/merge-base.o
+BUILTIN_OBJS += builtin/merge-file.o
+BUILTIN_OBJS += builtin/merge-index.o
+BUILTIN_OBJS += builtin/merge-ours.o
+BUILTIN_OBJS += builtin/merge-recursive.o
+BUILTIN_OBJS += builtin/merge-tree.o
+BUILTIN_OBJS += builtin/mktag.o
+BUILTIN_OBJS += builtin/mktree.o
+BUILTIN_OBJS += builtin/mv.o
+BUILTIN_OBJS += builtin/name-rev.o
+BUILTIN_OBJS += builtin/pack-objects.o
+BUILTIN_OBJS += builtin/pack-redundant.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
+BUILTIN_OBJS += builtin/read-tree.o
+BUILTIN_OBJS += builtin/receive-pack.o
+BUILTIN_OBJS += builtin/reflog.o
+BUILTIN_OBJS += builtin/remote.o
+BUILTIN_OBJS += builtin/replace.o
+BUILTIN_OBJS += builtin/rerere.o
+BUILTIN_OBJS += builtin/reset.o
+BUILTIN_OBJS += builtin/rev-list.o
+BUILTIN_OBJS += builtin/rev-parse.o
+BUILTIN_OBJS += builtin/revert.o
+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-ref.o
+BUILTIN_OBJS += builtin/stripspace.o
+BUILTIN_OBJS += builtin/symbolic-ref.o
+BUILTIN_OBJS += builtin/tag.o
+BUILTIN_OBJS += builtin/tar-tree.o
+BUILTIN_OBJS += builtin/unpack-file.o
+BUILTIN_OBJS += builtin/unpack-objects.o
+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
 
 GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
 EXTLIBS =
@@ -1445,8 +1445,8 @@ git$X: git.o $(BUILTIN_OBJS) $(GITLIBS)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
 		$(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
 
-builtin-help.o: common-cmds.h
-builtin-help.s builtin-help.o: ALL_CFLAGS += \
+builtin/help.o: common-cmds.h
+builtin/help.s builtin/help.o: ALL_CFLAGS += \
 	'-DGIT_HTML_PATH="$(htmldir_SQ)"' \
 	'-DGIT_MAN_PATH="$(mandir_SQ)"' \
 	'-DGIT_INFO_PATH="$(infodir_SQ)"'
@@ -1594,7 +1594,7 @@ exec_cmd.s exec_cmd.o: ALL_CFLAGS += \
 	'-DBINDIR="$(bindir_relative_SQ)"' \
 	'-DPREFIX="$(prefix_SQ)"'
 
-builtin-init-db.s builtin-init-db.o: ALL_CFLAGS += \
+builtin/init-db.s builtin/init-db.o: ALL_CFLAGS += \
 	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
 
 config.s config.o: ALL_CFLAGS += -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
@@ -1636,7 +1636,7 @@ $(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o $(GITLIBS)
 
 $(LIB_OBJS) $(BUILTIN_OBJS): $(LIB_H)
 $(patsubst git-%$X,%.o,$(PROGRAMS)) git.o: $(LIB_H) $(wildcard */*.h)
-builtin-revert.o wt-status.o: wt-status.h
+builtin/revert.o wt-status.o: wt-status.h
 
 $(LIB_FILE): $(LIB_OBJS)
 	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
diff --git a/builtin-add.c b/builtin/add.c
similarity index 100%
rename from builtin-add.c
rename to builtin/add.c
diff --git a/builtin-annotate.c b/builtin/annotate.c
similarity index 100%
rename from builtin-annotate.c
rename to builtin/annotate.c
diff --git a/builtin-apply.c b/builtin/apply.c
similarity index 100%
rename from builtin-apply.c
rename to builtin/apply.c
diff --git a/builtin-archive.c b/builtin/archive.c
similarity index 100%
rename from builtin-archive.c
rename to builtin/archive.c
diff --git a/builtin-bisect--helper.c b/builtin/bisect--helper.c
similarity index 100%
rename from builtin-bisect--helper.c
rename to builtin/bisect--helper.c
diff --git a/builtin-blame.c b/builtin/blame.c
similarity index 100%
rename from builtin-blame.c
rename to builtin/blame.c
diff --git a/builtin-branch.c b/builtin/branch.c
similarity index 100%
rename from builtin-branch.c
rename to builtin/branch.c
diff --git a/builtin.h b/builtin/builtin.h
similarity index 100%
rename from builtin.h
rename to builtin/builtin.h
diff --git a/builtin-bundle.c b/builtin/bundle.c
similarity index 100%
rename from builtin-bundle.c
rename to builtin/bundle.c
diff --git a/builtin-cat-file.c b/builtin/cat-file.c
similarity index 100%
rename from builtin-cat-file.c
rename to builtin/cat-file.c
diff --git a/builtin-check-attr.c b/builtin/check-attr.c
similarity index 100%
rename from builtin-check-attr.c
rename to builtin/check-attr.c
diff --git a/builtin-check-ref-format.c b/builtin/check-ref-format.c
similarity index 100%
rename from builtin-check-ref-format.c
rename to builtin/check-ref-format.c
diff --git a/builtin-checkout-index.c b/builtin/checkout-index.c
similarity index 100%
rename from builtin-checkout-index.c
rename to builtin/checkout-index.c
diff --git a/builtin-checkout.c b/builtin/checkout.c
similarity index 100%
rename from builtin-checkout.c
rename to builtin/checkout.c
diff --git a/builtin-clean.c b/builtin/clean.c
similarity index 100%
rename from builtin-clean.c
rename to builtin/clean.c
diff --git a/builtin-clone.c b/builtin/clone.c
similarity index 100%
rename from builtin-clone.c
rename to builtin/clone.c
diff --git a/builtin-commit-tree.c b/builtin/commit-tree.c
similarity index 100%
rename from builtin-commit-tree.c
rename to builtin/commit-tree.c
diff --git a/builtin-commit.c b/builtin/commit.c
similarity index 100%
rename from builtin-commit.c
rename to builtin/commit.c
diff --git a/builtin-config.c b/builtin/config.c
similarity index 100%
rename from builtin-config.c
rename to builtin/config.c
diff --git a/builtin-count-objects.c b/builtin/count-objects.c
similarity index 100%
rename from builtin-count-objects.c
rename to builtin/count-objects.c
diff --git a/builtin-describe.c b/builtin/describe.c
similarity index 100%
rename from builtin-describe.c
rename to builtin/describe.c
diff --git a/builtin-diff-files.c b/builtin/diff-files.c
similarity index 100%
rename from builtin-diff-files.c
rename to builtin/diff-files.c
diff --git a/builtin-diff-index.c b/builtin/diff-index.c
similarity index 100%
rename from builtin-diff-index.c
rename to builtin/diff-index.c
diff --git a/builtin-diff-tree.c b/builtin/diff-tree.c
similarity index 100%
rename from builtin-diff-tree.c
rename to builtin/diff-tree.c
diff --git a/builtin-diff.c b/builtin/diff.c
similarity index 100%
rename from builtin-diff.c
rename to builtin/diff.c
diff --git a/builtin-fast-export.c b/builtin/fast-export.c
similarity index 100%
rename from builtin-fast-export.c
rename to builtin/fast-export.c
diff --git a/builtin-fetch-pack.c b/builtin/fetch-pack.c
similarity index 100%
rename from builtin-fetch-pack.c
rename to builtin/fetch-pack.c
diff --git a/builtin-fetch.c b/builtin/fetch.c
similarity index 100%
rename from builtin-fetch.c
rename to builtin/fetch.c
diff --git a/builtin-fmt-merge-msg.c b/builtin/fmt-merge-msg.c
similarity index 100%
rename from builtin-fmt-merge-msg.c
rename to builtin/fmt-merge-msg.c
diff --git a/builtin-for-each-ref.c b/builtin/for-each-ref.c
similarity index 100%
rename from builtin-for-each-ref.c
rename to builtin/for-each-ref.c
diff --git a/builtin-fsck.c b/builtin/fsck.c
similarity index 100%
rename from builtin-fsck.c
rename to builtin/fsck.c
diff --git a/builtin-gc.c b/builtin/gc.c
similarity index 100%
rename from builtin-gc.c
rename to builtin/gc.c
diff --git a/builtin-grep.c b/builtin/grep.c
similarity index 100%
rename from builtin-grep.c
rename to builtin/grep.c
diff --git a/builtin-hash-object.c b/builtin/hash-object.c
similarity index 100%
rename from builtin-hash-object.c
rename to builtin/hash-object.c
diff --git a/builtin-help.c b/builtin/help.c
similarity index 100%
rename from builtin-help.c
rename to builtin/help.c
diff --git a/builtin-index-pack.c b/builtin/index-pack.c
similarity index 100%
rename from builtin-index-pack.c
rename to builtin/index-pack.c
diff --git a/builtin-init-db.c b/builtin/init-db.c
similarity index 100%
rename from builtin-init-db.c
rename to builtin/init-db.c
diff --git a/builtin-log.c b/builtin/log.c
similarity index 100%
rename from builtin-log.c
rename to builtin/log.c
diff --git a/builtin-ls-files.c b/builtin/ls-files.c
similarity index 100%
rename from builtin-ls-files.c
rename to builtin/ls-files.c
diff --git a/builtin-ls-remote.c b/builtin/ls-remote.c
similarity index 100%
rename from builtin-ls-remote.c
rename to builtin/ls-remote.c
diff --git a/builtin-ls-tree.c b/builtin/ls-tree.c
similarity index 100%
rename from builtin-ls-tree.c
rename to builtin/ls-tree.c
diff --git a/builtin-mailinfo.c b/builtin/mailinfo.c
similarity index 100%
rename from builtin-mailinfo.c
rename to builtin/mailinfo.c
diff --git a/builtin-mailsplit.c b/builtin/mailsplit.c
similarity index 100%
rename from builtin-mailsplit.c
rename to builtin/mailsplit.c
diff --git a/builtin-merge-base.c b/builtin/merge-base.c
similarity index 100%
rename from builtin-merge-base.c
rename to builtin/merge-base.c
diff --git a/builtin-merge-file.c b/builtin/merge-file.c
similarity index 100%
rename from builtin-merge-file.c
rename to builtin/merge-file.c
diff --git a/builtin-merge-index.c b/builtin/merge-index.c
similarity index 100%
rename from builtin-merge-index.c
rename to builtin/merge-index.c
diff --git a/builtin-merge-ours.c b/builtin/merge-ours.c
similarity index 100%
rename from builtin-merge-ours.c
rename to builtin/merge-ours.c
diff --git a/builtin-merge-recursive.c b/builtin/merge-recursive.c
similarity index 100%
rename from builtin-merge-recursive.c
rename to builtin/merge-recursive.c
diff --git a/builtin-merge-tree.c b/builtin/merge-tree.c
similarity index 100%
rename from builtin-merge-tree.c
rename to builtin/merge-tree.c
diff --git a/builtin-merge.c b/builtin/merge.c
similarity index 100%
rename from builtin-merge.c
rename to builtin/merge.c
diff --git a/builtin-mktag.c b/builtin/mktag.c
similarity index 100%
rename from builtin-mktag.c
rename to builtin/mktag.c
diff --git a/builtin-mktree.c b/builtin/mktree.c
similarity index 100%
rename from builtin-mktree.c
rename to builtin/mktree.c
diff --git a/builtin-mv.c b/builtin/mv.c
similarity index 100%
rename from builtin-mv.c
rename to builtin/mv.c
diff --git a/builtin-name-rev.c b/builtin/name-rev.c
similarity index 100%
rename from builtin-name-rev.c
rename to builtin/name-rev.c
diff --git a/builtin-pack-objects.c b/builtin/pack-objects.c
similarity index 100%
rename from builtin-pack-objects.c
rename to builtin/pack-objects.c
diff --git a/builtin-pack-redundant.c b/builtin/pack-redundant.c
similarity index 100%
rename from builtin-pack-redundant.c
rename to builtin/pack-redundant.c
diff --git a/builtin-pack-refs.c b/builtin/pack-refs.c
similarity index 100%
rename from builtin-pack-refs.c
rename to builtin/pack-refs.c
diff --git a/builtin-patch-id.c b/builtin/patch-id.c
similarity index 100%
rename from builtin-patch-id.c
rename to builtin/patch-id.c
diff --git a/builtin-prune-packed.c b/builtin/prune-packed.c
similarity index 100%
rename from builtin-prune-packed.c
rename to builtin/prune-packed.c
diff --git a/builtin-prune.c b/builtin/prune.c
similarity index 100%
rename from builtin-prune.c
rename to builtin/prune.c
diff --git a/builtin-push.c b/builtin/push.c
similarity index 100%
rename from builtin-push.c
rename to builtin/push.c
diff --git a/builtin-read-tree.c b/builtin/read-tree.c
similarity index 100%
rename from builtin-read-tree.c
rename to builtin/read-tree.c
diff --git a/builtin-receive-pack.c b/builtin/receive-pack.c
similarity index 100%
rename from builtin-receive-pack.c
rename to builtin/receive-pack.c
diff --git a/builtin-reflog.c b/builtin/reflog.c
similarity index 100%
rename from builtin-reflog.c
rename to builtin/reflog.c
diff --git a/builtin-remote.c b/builtin/remote.c
similarity index 100%
rename from builtin-remote.c
rename to builtin/remote.c
diff --git a/builtin-replace.c b/builtin/replace.c
similarity index 100%
rename from builtin-replace.c
rename to builtin/replace.c
diff --git a/builtin-rerere.c b/builtin/rerere.c
similarity index 100%
rename from builtin-rerere.c
rename to builtin/rerere.c
diff --git a/builtin-reset.c b/builtin/reset.c
similarity index 100%
rename from builtin-reset.c
rename to builtin/reset.c
diff --git a/builtin-rev-list.c b/builtin/rev-list.c
similarity index 100%
rename from builtin-rev-list.c
rename to builtin/rev-list.c
diff --git a/builtin-rev-parse.c b/builtin/rev-parse.c
similarity index 100%
rename from builtin-rev-parse.c
rename to builtin/rev-parse.c
diff --git a/builtin-revert.c b/builtin/revert.c
similarity index 100%
rename from builtin-revert.c
rename to builtin/revert.c
diff --git a/builtin-rm.c b/builtin/rm.c
similarity index 100%
rename from builtin-rm.c
rename to builtin/rm.c
diff --git a/builtin-send-pack.c b/builtin/send-pack.c
similarity index 100%
rename from builtin-send-pack.c
rename to builtin/send-pack.c
diff --git a/builtin-shortlog.c b/builtin/shortlog.c
similarity index 100%
rename from builtin-shortlog.c
rename to builtin/shortlog.c
diff --git a/builtin-show-branch.c b/builtin/show-branch.c
similarity index 100%
rename from builtin-show-branch.c
rename to builtin/show-branch.c
diff --git a/builtin-show-ref.c b/builtin/show-ref.c
similarity index 100%
rename from builtin-show-ref.c
rename to builtin/show-ref.c
diff --git a/builtin-stripspace.c b/builtin/stripspace.c
similarity index 100%
rename from builtin-stripspace.c
rename to builtin/stripspace.c
diff --git a/builtin-symbolic-ref.c b/builtin/symbolic-ref.c
similarity index 100%
rename from builtin-symbolic-ref.c
rename to builtin/symbolic-ref.c
diff --git a/builtin-tag.c b/builtin/tag.c
similarity index 100%
rename from builtin-tag.c
rename to builtin/tag.c
diff --git a/builtin-tar-tree.c b/builtin/tar-tree.c
similarity index 100%
rename from builtin-tar-tree.c
rename to builtin/tar-tree.c
diff --git a/builtin-unpack-file.c b/builtin/unpack-file.c
similarity index 100%
rename from builtin-unpack-file.c
rename to builtin/unpack-file.c
diff --git a/builtin-unpack-objects.c b/builtin/unpack-objects.c
similarity index 100%
rename from builtin-unpack-objects.c
rename to builtin/unpack-objects.c
diff --git a/builtin-update-index.c b/builtin/update-index.c
similarity index 100%
rename from builtin-update-index.c
rename to builtin/update-index.c
diff --git a/builtin-update-ref.c b/builtin/update-ref.c
similarity index 100%
rename from builtin-update-ref.c
rename to builtin/update-ref.c
diff --git a/builtin-update-server-info.c b/builtin/update-server-info.c
similarity index 100%
rename from builtin-update-server-info.c
rename to builtin/update-server-info.c
diff --git a/builtin-upload-archive.c b/builtin/upload-archive.c
similarity index 100%
rename from builtin-upload-archive.c
rename to builtin/upload-archive.c
diff --git a/builtin-var.c b/builtin/var.c
similarity index 100%
rename from builtin-var.c
rename to builtin/var.c
diff --git a/builtin-verify-pack.c b/builtin/verify-pack.c
similarity index 100%
rename from builtin-verify-pack.c
rename to builtin/verify-pack.c
diff --git a/builtin-verify-tag.c b/builtin/verify-tag.c
similarity index 100%
rename from builtin-verify-tag.c
rename to builtin/verify-tag.c
diff --git a/builtin-write-tree.c b/builtin/write-tree.c
similarity index 100%
rename from builtin-write-tree.c
rename to builtin/write-tree.c
Junio C Hamano· Feb 18, 2010, 20:24 UTC · re: Linus Torvalds · lore

Re: [RFD] Deepen the git directory structure a bit.

Linus Torvalds <torvalds@linux-foundation.org> writes:
Show 6 quoted lines
> I think this coul probably be done differently (I'm not proud of that ugly 
> '-I. -Ibuiltin' addition to the CFLAGS, for example), and I think there 
> are _other_ things we could also try to do to move files into 
> subdirectories, but this was a fairly easy thing to basically script.
>
> What do people think?

I personally like the general direction you are going. One minor detail I do not know about is whether to move "builtin.h" with others, or leave it at the top. Also I don't particularly find "-I. -Ibuiltin/" ugly. It would make sense to use "-I." and rewrite our '#include "xyzzy.h"' into '#include <xyzzy.h>' even if we were not doing this change.

Avery Pennarun· Feb 18, 2010, 21:50 UTC · re: Junio C Hamano · lore

Re: [RFD] Deepen the git directory structure a bit.

On Thu, Feb 18, 2010 at 3:24 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 11 quoted lines
> Linus Torvalds <torvalds@linux-foundation.org> writes:
>> I think this coul probably be done differently (I'm not proud of that ugly
>> '-I. -Ibuiltin' addition to the CFLAGS, for example), and I think there
>> are _other_ things we could also try to do to move files into
>> subdirectories, but this was a fairly easy thing to basically script.
>>
>> What do people think?
>
> I personally like the general direction you are going.  One minor detail I
> do not know about is whether to move "builtin.h" with others, or leave it
> at the top.

If you don't move it, then it'll continue to interfere with autocompletion. Though maybe that's not a good enough reason :)

Have fun,
Avery
Linus Torvalds· Feb 18, 2010, 22:20 UTC · re: Avery Pennarun · lore

Re: [RFD] Deepen the git directory structure a bit.

On Thu, 18 Feb 2010, Avery Pennarun wrote:
> 
> If you don't move it, then it'll continue to interfere with
> autocompletion.  Though maybe that's not a good enough reason :)

Yeah, that's not a huge deal. We have other files that share prefixes. The "builtin-" prefix was just _so_ common as to really screw up auto-completion in a big way.

So the reason for moving builtin.h was simply that _most_ of the users are the builtin headers themselves (and as mentioned, I was thinking of making it builtin/cmd.h but avoided it to keep the patch size down).

		Linus
Linus Torvalds· Feb 18, 2010, 22:18 UTC · re: Junio C Hamano · lore

Re: [RFD] Deepen the git directory structure a bit.

On Thu, 18 Feb 2010, Junio C Hamano wrote:
Show 6 quoted lines
> 
> I personally like the general direction you are going.  One minor detail I
> do not know about is whether to move "builtin.h" with others, or leave it
> at the top.  Also I don't particularly find "-I. -Ibuiltin/" ugly.  It
> would make sense to use "-I." and rewrite our '#include "xyzzy.h"' into
> '#include <xyzzy.h>' even if we were not doing this change.
I was actually thinking of just changing everybody to use
	-#include "builtin.h"
	+#include "builtin/cmd.h"

and I even did that with a sed script, but then the renames aren't pure renames any more, so I decided that in order to make the patch be a minimal rename thing, that would be a second phase.

		Linus
Christian MICHON· Feb 18, 2010, 23:34 UTC · re: Linus Torvalds · lore

Re: [RFD] Deepen the git directory structure a bit.

On Thu, Feb 18, 2010 at 7:36 PM, Linus Torvalds <torvalds@linux-foundation.org> wrote:

Show 9 quoted lines
>
> Ok, this is just a request-for-discussion. I'm trying out a patch like
> this, and I think it's a step in the right direction. The git directory
> structure is _very_ flat, and currently in a fully built git tree, the
> top-level directory has something like 750 files in it.
>
> After this, it still has a ton of files, but it has shrunk to ~575 files
> instead, and at least for my (admittedly somewhat odd) setup, that
> actually matters for auto-completion etc.

maybe rather than just autocompletion, it does help new code to land in the right place ? I think just for this reason at least it's a good move.

I've a wild idea on a new command to add to git and I was pondering between having it as a perl script or a builtin. Now I know where it should go if I choose a builtin, provided you get a wide consensus.

Show 8 quoted lines
> which doesn't seem all that different, but not having that annoying
> break in "Display all 180 possibilities?" is quite a relief.
>
> NOTE! If you do this in a clean tree (no object files etc), or using an
> editor that has auto-completion rules that ignores '*.o' files, you
> won't see that annoying 'Display all 180 possibilities?' message - it
> will just show the choices instead.  I think bash has some cut-off
> around 100 choices or something.
odd. On my msysgit setup and bash 3.1, I get this on a clean tree:

$ ls builtin<tab> Display all 90 possibilities? (y or n)

But hey, this is on Windows, so we should not bother :-)
-- 
Christian
--
http://detaolb.sourceforge.net/, a linux distribution for Qemu with Git inside !
Pavan Kumar Sunkara· Feb 19, 2010, 03:50 UTC · re: Christian MICHON · lore

Re: [RFD] Deepen the git directory structure a bit.

Show 9 quoted lines
>
> maybe rather than just autocompletion, it does help new code to land
> in the right place ? I think just for this reason at least it's a good
> move.
>
> I've a wild idea on a new command to add to git and I was pondering
> between having it as a perl script or a builtin. Now I know where it
> should go if I choose a builtin, provided you get a wide consensus.
>

I agree with this. This will be very good to guys who want to start understanding the code completely

Linus Torvalds· Feb 22, 2010, 16:42 UTC · re: Linus Torvalds · lore

Re: [RFD] Deepen the git directory structure a bit.

Btw, here's a new version of this without the 'builtin.h' rename. This was basically created with:

	for i in builtin-*; do git mv $i $(echo $i | sed 's:builtin-:builtin/:'); done
	sed 's:builtin-:builtin/:' Makefile > Makefile.new
	mv Makefile.new Makefile
	 ... add '-I.' to BASIC_FLAGS in 'Makefile' ...
	git commit -a
and it leaves the issue of what to do with the header files for later.

For example, maybe somebody would want to split up the makefile so that the 'builtin' subdirectory gets built all on its own. In which case you'd do a "-I.." there instead. Or maybe somebody wants to move the header files to a directory of their own, separate from either the regular C files _and_ the builtin commands.

So to not even weigh in on that whole discussion, this _just_ moves the builtin-* files, and adds the currently minimal "-I." to the makefile.

			Linus
---
From dc996ed626408db548cea7e7ed20186da735d558 Mon Sep 17 00:00:00 2001
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Thu, 18 Feb 2010 10:11:32 -0800
Subject: [PATCH] Move 'builtin-*' into a 'builtin/' subdirectory

This shrinks the top-level directory a bit, and makes it much more pleasant to use auto-completion on the thing. Instead of

	[torvalds@nehalem git]$ em buil<tab>
	Display all 180 possibilities? (y or n)
	[torvalds@nehalem git]$ em builtin-sh
	builtin-shortlog.c     builtin-show-branch.c  builtin-show-ref.c
	builtin-shortlog.o     builtin-show-branch.o  builtin-show-ref.o
	[torvalds@nehalem git]$ em builtin-shor<tab>
	builtin-shortlog.c  builtin-shortlog.o
	[torvalds@nehalem git]$ em builtin-shortlog.c
you get
	[torvalds@nehalem git]$ em buil<tab>		[type]
	builtin/   builtin.h
	[torvalds@nehalem git]$ em builtin		[auto-completes to]
	[torvalds@nehalem git]$ em builtin/sh<tab>	[type]
	shortlog.c     shortlog.o     show-branch.c  show-branch.o  show-ref.c     show-ref.o
	[torvalds@nehalem git]$ em builtin/sho		[auto-completes to]
	[torvalds@nehalem git]$ em builtin/shor<tab>	[type]
	shortlog.c  shortlog.o
	[torvalds@nehalem git]$ em builtin/shortlog.c

which doesn't seem all that different, but not having that annoying break in "Display all 180 possibilities?" is quite a relief.

NOTE! If you do this in a clean tree (no object files etc), or using an editor that has auto-completion rules that ignores '*.o' files, you won't see that annoying 'Display all 180 possibilities?' message - it will just show the choices instead. I think bash has some cut-off around 100 choices or something.

So the reason I see this is that I'm using an odd editory, and thus don't have the rules to cut down on auto-completion. But you can simulate that by using 'ls' instead, or something similar.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
---
 Makefile                                           |  192 ++++++++++----------
 builtin-add.c => builtin/add.c                     |    0
 builtin-annotate.c => builtin/annotate.c           |    0
 builtin-apply.c => builtin/apply.c                 |    0
 builtin-archive.c => builtin/archive.c             |    0
 .../bisect--helper.c                               |    0
 builtin-blame.c => builtin/blame.c                 |    0
 builtin-branch.c => builtin/branch.c               |    0
 builtin-bundle.c => builtin/bundle.c               |    0
 builtin-cat-file.c => builtin/cat-file.c           |    0
 builtin-check-attr.c => builtin/check-attr.c       |    0
 .../check-ref-format.c                             |    0
 .../checkout-index.c                               |    0
 builtin-checkout.c => builtin/checkout.c           |    0
 builtin-clean.c => builtin/clean.c                 |    0
 builtin-clone.c => builtin/clone.c                 |    0
 builtin-commit-tree.c => builtin/commit-tree.c     |    0
 builtin-commit.c => builtin/commit.c               |    0
 builtin-config.c => builtin/config.c               |    0
 builtin-count-objects.c => builtin/count-objects.c |    0
 builtin-describe.c => builtin/describe.c           |    0
 builtin-diff-files.c => builtin/diff-files.c       |    0
 builtin-diff-index.c => builtin/diff-index.c       |    0
 builtin-diff-tree.c => builtin/diff-tree.c         |    0
 builtin-diff.c => builtin/diff.c                   |    0
 builtin-fast-export.c => builtin/fast-export.c     |    0
 builtin-fetch-pack.c => builtin/fetch-pack.c       |    0
 builtin-fetch.c => builtin/fetch.c                 |    0
 builtin-fmt-merge-msg.c => builtin/fmt-merge-msg.c |    0
 builtin-for-each-ref.c => builtin/for-each-ref.c   |    0
 builtin-fsck.c => builtin/fsck.c                   |    0
 builtin-gc.c => builtin/gc.c                       |    0
 builtin-grep.c => builtin/grep.c                   |    0
 builtin-hash-object.c => builtin/hash-object.c     |    0
 builtin-help.c => builtin/help.c                   |    0
 builtin-index-pack.c => builtin/index-pack.c       |    0
 builtin-init-db.c => builtin/init-db.c             |    0
 builtin-log.c => builtin/log.c                     |    0
 builtin-ls-files.c => builtin/ls-files.c           |    0
 builtin-ls-remote.c => builtin/ls-remote.c         |    0
 builtin-ls-tree.c => builtin/ls-tree.c             |    0
 builtin-mailinfo.c => builtin/mailinfo.c           |    0
 builtin-mailsplit.c => builtin/mailsplit.c         |    0
 builtin-merge-base.c => builtin/merge-base.c       |    0
 builtin-merge-file.c => builtin/merge-file.c       |    0
 builtin-merge-index.c => builtin/merge-index.c     |    0
 builtin-merge-ours.c => builtin/merge-ours.c       |    0
 .../merge-recursive.c                              |    0
 builtin-merge-tree.c => builtin/merge-tree.c       |    0
 builtin-merge.c => builtin/merge.c                 |    0
 builtin-mktag.c => builtin/mktag.c                 |    0
 builtin-mktree.c => builtin/mktree.c               |    0
 builtin-mv.c => builtin/mv.c                       |    0
 builtin-name-rev.c => builtin/name-rev.c           |    0
 builtin-pack-objects.c => builtin/pack-objects.c   |    0
 .../pack-redundant.c                               |    0
 builtin-pack-refs.c => builtin/pack-refs.c         |    0
 builtin-patch-id.c => builtin/patch-id.c           |    0
 builtin-prune-packed.c => builtin/prune-packed.c   |    0
 builtin-prune.c => builtin/prune.c                 |    0
 builtin-push.c => builtin/push.c                   |    0
 builtin-read-tree.c => builtin/read-tree.c         |    0
 builtin-receive-pack.c => builtin/receive-pack.c   |    0
 builtin-reflog.c => builtin/reflog.c               |    0
 builtin-remote.c => builtin/remote.c               |    0
 builtin-replace.c => builtin/replace.c             |    0
 builtin-rerere.c => builtin/rerere.c               |    0
 builtin-reset.c => builtin/reset.c                 |    0
 builtin-rev-list.c => builtin/rev-list.c           |    0
 builtin-rev-parse.c => builtin/rev-parse.c         |    0
 builtin-revert.c => builtin/revert.c               |    0
 builtin-rm.c => builtin/rm.c                       |    0
 builtin-send-pack.c => builtin/send-pack.c         |    0
 builtin-shortlog.c => builtin/shortlog.c           |    0
 builtin-show-branch.c => builtin/show-branch.c     |    0
 builtin-show-ref.c => builtin/show-ref.c           |    0
 builtin-stripspace.c => builtin/stripspace.c       |    0
 builtin-symbolic-ref.c => builtin/symbolic-ref.c   |    0
 builtin-tag.c => builtin/tag.c                     |    0
 builtin-tar-tree.c => builtin/tar-tree.c           |    0
 builtin-unpack-file.c => builtin/unpack-file.c     |    0
 .../unpack-objects.c                               |    0
 builtin-update-index.c => builtin/update-index.c   |    0
 builtin-update-ref.c => builtin/update-ref.c       |    0
 .../update-server-info.c                           |    0
 .../upload-archive.c                               |    0
 builtin-var.c => builtin/var.c                     |    0
 builtin-verify-pack.c => builtin/verify-pack.c     |    0
 builtin-verify-tag.c => builtin/verify-tag.c       |    0
 builtin-write-tree.c => builtin/write-tree.c       |    0
 90 files changed, 96 insertions(+), 96 deletions(-)
 rename builtin-add.c => builtin/add.c (100%)
 rename builtin-annotate.c => builtin/annotate.c (100%)
 rename builtin-apply.c => builtin/apply.c (100%)
 rename builtin-archive.c => builtin/archive.c (100%)
 rename builtin-bisect--helper.c => builtin/bisect--helper.c (100%)
 rename builtin-blame.c => builtin/blame.c (100%)
 rename builtin-branch.c => builtin/branch.c (100%)
 rename builtin-bundle.c => builtin/bundle.c (100%)
 rename builtin-cat-file.c => builtin/cat-file.c (100%)
 rename builtin-check-attr.c => builtin/check-attr.c (100%)
 rename builtin-check-ref-format.c => builtin/check-ref-format.c (100%)
 rename builtin-checkout-index.c => builtin/checkout-index.c (100%)
 rename builtin-checkout.c => builtin/checkout.c (100%)
 rename builtin-clean.c => builtin/clean.c (100%)
 rename builtin-clone.c => builtin/clone.c (100%)
 rename builtin-commit-tree.c => builtin/commit-tree.c (100%)
 rename builtin-commit.c => builtin/commit.c (100%)
 rename builtin-config.c => builtin/config.c (100%)
 rename builtin-count-objects.c => builtin/count-objects.c (100%)
 rename builtin-describe.c => builtin/describe.c (100%)
 rename builtin-diff-files.c => builtin/diff-files.c (100%)
 rename builtin-diff-index.c => builtin/diff-index.c (100%)
 rename builtin-diff-tree.c => builtin/diff-tree.c (100%)
 rename builtin-diff.c => builtin/diff.c (100%)
 rename builtin-fast-export.c => builtin/fast-export.c (100%)
 rename builtin-fetch-pack.c => builtin/fetch-pack.c (100%)
 rename builtin-fetch.c => builtin/fetch.c (100%)
 rename builtin-fmt-merge-msg.c => builtin/fmt-merge-msg.c (100%)
 rename builtin-for-each-ref.c => builtin/for-each-ref.c (100%)
 rename builtin-fsck.c => builtin/fsck.c (100%)
 rename builtin-gc.c => builtin/gc.c (100%)
 rename builtin-grep.c => builtin/grep.c (100%)
 rename builtin-hash-object.c => builtin/hash-object.c (100%)
 rename builtin-help.c => builtin/help.c (100%)
 rename builtin-index-pack.c => builtin/index-pack.c (100%)
 rename builtin-init-db.c => builtin/init-db.c (100%)
 rename builtin-log.c => builtin/log.c (100%)
 rename builtin-ls-files.c => builtin/ls-files.c (100%)
 rename builtin-ls-remote.c => builtin/ls-remote.c (100%)
 rename builtin-ls-tree.c => builtin/ls-tree.c (100%)
 rename builtin-mailinfo.c => builtin/mailinfo.c (100%)
 rename builtin-mailsplit.c => builtin/mailsplit.c (100%)
 rename builtin-merge-base.c => builtin/merge-base.c (100%)
 rename builtin-merge-file.c => builtin/merge-file.c (100%)
 rename builtin-merge-index.c => builtin/merge-index.c (100%)
 rename builtin-merge-ours.c => builtin/merge-ours.c (100%)
 rename builtin-merge-recursive.c => builtin/merge-recursive.c (100%)
 rename builtin-merge-tree.c => builtin/merge-tree.c (100%)
 rename builtin-merge.c => builtin/merge.c (100%)
 rename builtin-mktag.c => builtin/mktag.c (100%)
 rename builtin-mktree.c => builtin/mktree.c (100%)
 rename builtin-mv.c => builtin/mv.c (100%)
 rename builtin-name-rev.c => builtin/name-rev.c (100%)
 rename builtin-pack-objects.c => builtin/pack-objects.c (100%)
 rename builtin-pack-redundant.c => builtin/pack-redundant.c (100%)
 rename builtin-pack-refs.c => builtin/pack-refs.c (100%)
 rename builtin-patch-id.c => builtin/patch-id.c (100%)
 rename builtin-prune-packed.c => builtin/prune-packed.c (100%)
 rename builtin-prune.c => builtin/prune.c (100%)
 rename builtin-push.c => builtin/push.c (100%)
 rename builtin-read-tree.c => builtin/read-tree.c (100%)
 rename builtin-receive-pack.c => builtin/receive-pack.c (100%)
 rename builtin-reflog.c => builtin/reflog.c (100%)
 rename builtin-remote.c => builtin/remote.c (100%)
 rename builtin-replace.c => builtin/replace.c (100%)
 rename builtin-rerere.c => builtin/rerere.c (100%)
 rename builtin-reset.c => builtin/reset.c (100%)
 rename builtin-rev-list.c => builtin/rev-list.c (100%)
 rename builtin-rev-parse.c => builtin/rev-parse.c (100%)
 rename builtin-revert.c => builtin/revert.c (100%)
 rename builtin-rm.c => builtin/rm.c (100%)
 rename builtin-send-pack.c => builtin/send-pack.c (100%)
 rename builtin-shortlog.c => builtin/shortlog.c (100%)
 rename builtin-show-branch.c => builtin/show-branch.c (100%)
 rename builtin-show-ref.c => builtin/show-ref.c (100%)
 rename builtin-stripspace.c => builtin/stripspace.c (100%)
 rename builtin-symbolic-ref.c => builtin/symbolic-ref.c (100%)
 rename builtin-tag.c => builtin/tag.c (100%)
 rename builtin-tar-tree.c => builtin/tar-tree.c (100%)
 rename builtin-unpack-file.c => builtin/unpack-file.c (100%)
 rename builtin-unpack-objects.c => builtin/unpack-objects.c (100%)
 rename builtin-update-index.c => builtin/update-index.c (100%)
 rename builtin-update-ref.c => builtin/update-ref.c (100%)
 rename builtin-update-server-info.c => builtin/update-server-info.c (100%)
 rename builtin-upload-archive.c => builtin/upload-archive.c (100%)
 rename builtin-var.c => builtin/var.c (100%)
 rename builtin-verify-pack.c => builtin/verify-pack.c (100%)
 rename builtin-verify-tag.c => builtin/verify-tag.c (100%)
 rename builtin-write-tree.c => builtin/write-tree.c (100%)
diff --git a/Makefile b/Makefile
index afedb54..b7fcb92 100644
--- a/Makefile
+++ b/Makefile
@@ -301,7 +301,7 @@ SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
 # Those must not be GNU-specific; they are shared with perl/ which may
 # be built by a different compiler. (Note that this is an artifact now
 # but it still might be nice to keep that distinction.)
-BASIC_CFLAGS =
+BASIC_CFLAGS = -I.
 BASIC_LDFLAGS =
 
 # Guard against environment variables
@@ -370,8 +370,8 @@ PROGRAMS += git-upload-pack$X
 PROGRAMS += git-http-backend$X
 
 # List built-in command $C whose implementation cmd_$C() is not in
-# builtin-$C.o but is linked in as part of some other command.
-BUILT_INS += $(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS))
+# builtin/$C.o but is linked in as part of some other command.
+BUILT_INS += $(patsubst builtin/%.o,git-%$X,$(BUILTIN_OBJS))
 
 BUILT_INS += git-cherry$X
 BUILT_INS += git-cherry-pick$X
@@ -594,95 +594,95 @@ LIB_OBJS += ws.o
 LIB_OBJS += wt-status.o
 LIB_OBJS += xdiff-interface.o
 
-BUILTIN_OBJS += builtin-add.o
-BUILTIN_OBJS += builtin-annotate.o
-BUILTIN_OBJS += builtin-apply.o
-BUILTIN_OBJS += builtin-archive.o
-BUILTIN_OBJS += builtin-bisect--helper.o
-BUILTIN_OBJS += builtin-blame.o
-BUILTIN_OBJS += builtin-branch.o
-BUILTIN_OBJS += builtin-bundle.o
-BUILTIN_OBJS += builtin-cat-file.o
-BUILTIN_OBJS += builtin-check-attr.o
-BUILTIN_OBJS += builtin-check-ref-format.o
-BUILTIN_OBJS += builtin-checkout-index.o
-BUILTIN_OBJS += builtin-checkout.o
-BUILTIN_OBJS += builtin-clean.o
-BUILTIN_OBJS += builtin-clone.o
-BUILTIN_OBJS += builtin-commit-tree.o
-BUILTIN_OBJS += builtin-commit.o
-BUILTIN_OBJS += builtin-config.o
-BUILTIN_OBJS += builtin-count-objects.o
-BUILTIN_OBJS += builtin-describe.o
-BUILTIN_OBJS += builtin-diff-files.o
-BUILTIN_OBJS += builtin-diff-index.o
-BUILTIN_OBJS += builtin-diff-tree.o
-BUILTIN_OBJS += builtin-diff.o
-BUILTIN_OBJS += builtin-fast-export.o
-BUILTIN_OBJS += builtin-fetch-pack.o
-BUILTIN_OBJS += builtin-fetch.o
-BUILTIN_OBJS += builtin-fmt-merge-msg.o
-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-index-pack.o
-BUILTIN_OBJS += builtin-init-db.o
-BUILTIN_OBJS += builtin-log.o
-BUILTIN_OBJS += builtin-ls-files.o
-BUILTIN_OBJS += builtin-ls-remote.o
-BUILTIN_OBJS += builtin-ls-tree.o
-BUILTIN_OBJS += builtin-mailinfo.o
-BUILTIN_OBJS += builtin-mailsplit.o
-BUILTIN_OBJS += builtin-merge.o
-BUILTIN_OBJS += builtin-merge-base.o
-BUILTIN_OBJS += builtin-merge-file.o
-BUILTIN_OBJS += builtin-merge-index.o
-BUILTIN_OBJS += builtin-merge-ours.o
-BUILTIN_OBJS += builtin-merge-recursive.o
-BUILTIN_OBJS += builtin-merge-tree.o
-BUILTIN_OBJS += builtin-mktag.o
-BUILTIN_OBJS += builtin-mktree.o
-BUILTIN_OBJS += builtin-mv.o
-BUILTIN_OBJS += builtin-name-rev.o
-BUILTIN_OBJS += builtin-pack-objects.o
-BUILTIN_OBJS += builtin-pack-redundant.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
-BUILTIN_OBJS += builtin-read-tree.o
-BUILTIN_OBJS += builtin-receive-pack.o
-BUILTIN_OBJS += builtin-reflog.o
-BUILTIN_OBJS += builtin-remote.o
-BUILTIN_OBJS += builtin-replace.o
-BUILTIN_OBJS += builtin-rerere.o
-BUILTIN_OBJS += builtin-reset.o
-BUILTIN_OBJS += builtin-rev-list.o
-BUILTIN_OBJS += builtin-rev-parse.o
-BUILTIN_OBJS += builtin-revert.o
-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-ref.o
-BUILTIN_OBJS += builtin-stripspace.o
-BUILTIN_OBJS += builtin-symbolic-ref.o
-BUILTIN_OBJS += builtin-tag.o
-BUILTIN_OBJS += builtin-tar-tree.o
-BUILTIN_OBJS += builtin-unpack-file.o
-BUILTIN_OBJS += builtin-unpack-objects.o
-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
+BUILTIN_OBJS += builtin/add.o
+BUILTIN_OBJS += builtin/annotate.o
+BUILTIN_OBJS += builtin/apply.o
+BUILTIN_OBJS += builtin/archive.o
+BUILTIN_OBJS += builtin/bisect--helper.o
+BUILTIN_OBJS += builtin/blame.o
+BUILTIN_OBJS += builtin/branch.o
+BUILTIN_OBJS += builtin/bundle.o
+BUILTIN_OBJS += builtin/cat-file.o
+BUILTIN_OBJS += builtin/check-attr.o
+BUILTIN_OBJS += builtin/check-ref-format.o
+BUILTIN_OBJS += builtin/checkout-index.o
+BUILTIN_OBJS += builtin/checkout.o
+BUILTIN_OBJS += builtin/clean.o
+BUILTIN_OBJS += builtin/clone.o
+BUILTIN_OBJS += builtin/commit-tree.o
+BUILTIN_OBJS += builtin/commit.o
+BUILTIN_OBJS += builtin/config.o
+BUILTIN_OBJS += builtin/count-objects.o
+BUILTIN_OBJS += builtin/describe.o
+BUILTIN_OBJS += builtin/diff-files.o
+BUILTIN_OBJS += builtin/diff-index.o
+BUILTIN_OBJS += builtin/diff-tree.o
+BUILTIN_OBJS += builtin/diff.o
+BUILTIN_OBJS += builtin/fast-export.o
+BUILTIN_OBJS += builtin/fetch-pack.o
+BUILTIN_OBJS += builtin/fetch.o
+BUILTIN_OBJS += builtin/fmt-merge-msg.o
+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/index-pack.o
+BUILTIN_OBJS += builtin/init-db.o
+BUILTIN_OBJS += builtin/log.o
+BUILTIN_OBJS += builtin/ls-files.o
+BUILTIN_OBJS += builtin/ls-remote.o
+BUILTIN_OBJS += builtin/ls-tree.o
+BUILTIN_OBJS += builtin/mailinfo.o
+BUILTIN_OBJS += builtin/mailsplit.o
+BUILTIN_OBJS += builtin/merge.o
+BUILTIN_OBJS += builtin/merge-base.o
+BUILTIN_OBJS += builtin/merge-file.o
+BUILTIN_OBJS += builtin/merge-index.o
+BUILTIN_OBJS += builtin/merge-ours.o
+BUILTIN_OBJS += builtin/merge-recursive.o
+BUILTIN_OBJS += builtin/merge-tree.o
+BUILTIN_OBJS += builtin/mktag.o
+BUILTIN_OBJS += builtin/mktree.o
+BUILTIN_OBJS += builtin/mv.o
+BUILTIN_OBJS += builtin/name-rev.o
+BUILTIN_OBJS += builtin/pack-objects.o
+BUILTIN_OBJS += builtin/pack-redundant.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
+BUILTIN_OBJS += builtin/read-tree.o
+BUILTIN_OBJS += builtin/receive-pack.o
+BUILTIN_OBJS += builtin/reflog.o
+BUILTIN_OBJS += builtin/remote.o
+BUILTIN_OBJS += builtin/replace.o
+BUILTIN_OBJS += builtin/rerere.o
+BUILTIN_OBJS += builtin/reset.o
+BUILTIN_OBJS += builtin/rev-list.o
+BUILTIN_OBJS += builtin/rev-parse.o
+BUILTIN_OBJS += builtin/revert.o
+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-ref.o
+BUILTIN_OBJS += builtin/stripspace.o
+BUILTIN_OBJS += builtin/symbolic-ref.o
+BUILTIN_OBJS += builtin/tag.o
+BUILTIN_OBJS += builtin/tar-tree.o
+BUILTIN_OBJS += builtin/unpack-file.o
+BUILTIN_OBJS += builtin/unpack-objects.o
+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
 
 GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
 EXTLIBS =
@@ -1447,8 +1447,8 @@ git$X: git.o $(BUILTIN_OBJS) $(GITLIBS)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
 		$(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
 
-builtin-help.o: common-cmds.h
-builtin-help.s builtin-help.o: ALL_CFLAGS += \
+builtin/help.o: common-cmds.h
+builtin/help.s builtin/help.o: ALL_CFLAGS += \
 	'-DGIT_HTML_PATH="$(htmldir_SQ)"' \
 	'-DGIT_MAN_PATH="$(mandir_SQ)"' \
 	'-DGIT_INFO_PATH="$(infodir_SQ)"'
@@ -1604,7 +1604,7 @@ exec_cmd.s exec_cmd.o: ALL_CFLAGS += \
 	'-DBINDIR="$(bindir_relative_SQ)"' \
 	'-DPREFIX="$(prefix_SQ)"'
 
-builtin-init-db.s builtin-init-db.o: ALL_CFLAGS += \
+builtin/init-db.s builtin/init-db.o: ALL_CFLAGS += \
 	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
 
 config.s config.o: ALL_CFLAGS += -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
@@ -1646,7 +1646,7 @@ $(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o $(GITLIBS)
 
 $(LIB_OBJS) $(BUILTIN_OBJS): $(LIB_H)
 $(patsubst git-%$X,%.o,$(PROGRAMS)) git.o: $(LIB_H) $(wildcard */*.h)
-builtin-revert.o wt-status.o: wt-status.h
+builtin/revert.o wt-status.o: wt-status.h
 
 $(LIB_FILE): $(LIB_OBJS)
 	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
diff --git a/builtin-add.c b/builtin/add.c
similarity index 100%
rename from builtin-add.c
rename to builtin/add.c
diff --git a/builtin-annotate.c b/builtin/annotate.c
similarity index 100%
rename from builtin-annotate.c
rename to builtin/annotate.c
diff --git a/builtin-apply.c b/builtin/apply.c
similarity index 100%
rename from builtin-apply.c
rename to builtin/apply.c
diff --git a/builtin-archive.c b/builtin/archive.c
similarity index 100%
rename from builtin-archive.c
rename to builtin/archive.c
diff --git a/builtin-bisect--helper.c b/builtin/bisect--helper.c
similarity index 100%
rename from builtin-bisect--helper.c
rename to builtin/bisect--helper.c
diff --git a/builtin-blame.c b/builtin/blame.c
similarity index 100%
rename from builtin-blame.c
rename to builtin/blame.c
diff --git a/builtin-branch.c b/builtin/branch.c
similarity index 100%
rename from builtin-branch.c
rename to builtin/branch.c
diff --git a/builtin-bundle.c b/builtin/bundle.c
similarity index 100%
rename from builtin-bundle.c
rename to builtin/bundle.c
diff --git a/builtin-cat-file.c b/builtin/cat-file.c
similarity index 100%
rename from builtin-cat-file.c
rename to builtin/cat-file.c
diff --git a/builtin-check-attr.c b/builtin/check-attr.c
similarity index 100%
rename from builtin-check-attr.c
rename to builtin/check-attr.c
diff --git a/builtin-check-ref-format.c b/builtin/check-ref-format.c
similarity index 100%
rename from builtin-check-ref-format.c
rename to builtin/check-ref-format.c
diff --git a/builtin-checkout-index.c b/builtin/checkout-index.c
similarity index 100%
rename from builtin-checkout-index.c
rename to builtin/checkout-index.c
diff --git a/builtin-checkout.c b/builtin/checkout.c
similarity index 100%
rename from builtin-checkout.c
rename to builtin/checkout.c
diff --git a/builtin-clean.c b/builtin/clean.c
similarity index 100%
rename from builtin-clean.c
rename to builtin/clean.c
diff --git a/builtin-clone.c b/builtin/clone.c
similarity index 100%
rename from builtin-clone.c
rename to builtin/clone.c
diff --git a/builtin-commit-tree.c b/builtin/commit-tree.c
similarity index 100%
rename from builtin-commit-tree.c
rename to builtin/commit-tree.c
diff --git a/builtin-commit.c b/builtin/commit.c
similarity index 100%
rename from builtin-commit.c
rename to builtin/commit.c
diff --git a/builtin-config.c b/builtin/config.c
similarity index 100%
rename from builtin-config.c
rename to builtin/config.c
diff --git a/builtin-count-objects.c b/builtin/count-objects.c
similarity index 100%
rename from builtin-count-objects.c
rename to builtin/count-objects.c
diff --git a/builtin-describe.c b/builtin/describe.c
similarity index 100%
rename from builtin-describe.c
rename to builtin/describe.c
diff --git a/builtin-diff-files.c b/builtin/diff-files.c
similarity index 100%
rename from builtin-diff-files.c
rename to builtin/diff-files.c
diff --git a/builtin-diff-index.c b/builtin/diff-index.c
similarity index 100%
rename from builtin-diff-index.c
rename to builtin/diff-index.c
diff --git a/builtin-diff-tree.c b/builtin/diff-tree.c
similarity index 100%
rename from builtin-diff-tree.c
rename to builtin/diff-tree.c
diff --git a/builtin-diff.c b/builtin/diff.c
similarity index 100%
rename from builtin-diff.c
rename to builtin/diff.c
diff --git a/builtin-fast-export.c b/builtin/fast-export.c
similarity index 100%
rename from builtin-fast-export.c
rename to builtin/fast-export.c
diff --git a/builtin-fetch-pack.c b/builtin/fetch-pack.c
similarity index 100%
rename from builtin-fetch-pack.c
rename to builtin/fetch-pack.c
diff --git a/builtin-fetch.c b/builtin/fetch.c
similarity index 100%
rename from builtin-fetch.c
rename to builtin/fetch.c
diff --git a/builtin-fmt-merge-msg.c b/builtin/fmt-merge-msg.c
similarity index 100%
rename from builtin-fmt-merge-msg.c
rename to builtin/fmt-merge-msg.c
diff --git a/builtin-for-each-ref.c b/builtin/for-each-ref.c
similarity index 100%
rename from builtin-for-each-ref.c
rename to builtin/for-each-ref.c
diff --git a/builtin-fsck.c b/builtin/fsck.c
similarity index 100%
rename from builtin-fsck.c
rename to builtin/fsck.c
diff --git a/builtin-gc.c b/builtin/gc.c
similarity index 100%
rename from builtin-gc.c
rename to builtin/gc.c
diff --git a/builtin-grep.c b/builtin/grep.c
similarity index 100%
rename from builtin-grep.c
rename to builtin/grep.c
diff --git a/builtin-hash-object.c b/builtin/hash-object.c
similarity index 100%
rename from builtin-hash-object.c
rename to builtin/hash-object.c
diff --git a/builtin-help.c b/builtin/help.c
similarity index 100%
rename from builtin-help.c
rename to builtin/help.c
diff --git a/builtin-index-pack.c b/builtin/index-pack.c
similarity index 100%
rename from builtin-index-pack.c
rename to builtin/index-pack.c
diff --git a/builtin-init-db.c b/builtin/init-db.c
similarity index 100%
rename from builtin-init-db.c
rename to builtin/init-db.c
diff --git a/builtin-log.c b/builtin/log.c
similarity index 100%
rename from builtin-log.c
rename to builtin/log.c
diff --git a/builtin-ls-files.c b/builtin/ls-files.c
similarity index 100%
rename from builtin-ls-files.c
rename to builtin/ls-files.c
diff --git a/builtin-ls-remote.c b/builtin/ls-remote.c
similarity index 100%
rename from builtin-ls-remote.c
rename to builtin/ls-remote.c
diff --git a/builtin-ls-tree.c b/builtin/ls-tree.c
similarity index 100%
rename from builtin-ls-tree.c
rename to builtin/ls-tree.c
diff --git a/builtin-mailinfo.c b/builtin/mailinfo.c
similarity index 100%
rename from builtin-mailinfo.c
rename to builtin/mailinfo.c
diff --git a/builtin-mailsplit.c b/builtin/mailsplit.c
similarity index 100%
rename from builtin-mailsplit.c
rename to builtin/mailsplit.c
diff --git a/builtin-merge-base.c b/builtin/merge-base.c
similarity index 100%
rename from builtin-merge-base.c
rename to builtin/merge-base.c
diff --git a/builtin-merge-file.c b/builtin/merge-file.c
similarity index 100%
rename from builtin-merge-file.c
rename to builtin/merge-file.c
diff --git a/builtin-merge-index.c b/builtin/merge-index.c
similarity index 100%
rename from builtin-merge-index.c
rename to builtin/merge-index.c
diff --git a/builtin-merge-ours.c b/builtin/merge-ours.c
similarity index 100%
rename from builtin-merge-ours.c
rename to builtin/merge-ours.c
diff --git a/builtin-merge-recursive.c b/builtin/merge-recursive.c
similarity index 100%
rename from builtin-merge-recursive.c
rename to builtin/merge-recursive.c
diff --git a/builtin-merge-tree.c b/builtin/merge-tree.c
similarity index 100%
rename from builtin-merge-tree.c
rename to builtin/merge-tree.c
diff --git a/builtin-merge.c b/builtin/merge.c
similarity index 100%
rename from builtin-merge.c
rename to builtin/merge.c
diff --git a/builtin-mktag.c b/builtin/mktag.c
similarity index 100%
rename from builtin-mktag.c
rename to builtin/mktag.c
diff --git a/builtin-mktree.c b/builtin/mktree.c
similarity index 100%
rename from builtin-mktree.c
rename to builtin/mktree.c
diff --git a/builtin-mv.c b/builtin/mv.c
similarity index 100%
rename from builtin-mv.c
rename to builtin/mv.c
diff --git a/builtin-name-rev.c b/builtin/name-rev.c
similarity index 100%
rename from builtin-name-rev.c
rename to builtin/name-rev.c
diff --git a/builtin-pack-objects.c b/builtin/pack-objects.c
similarity index 100%
rename from builtin-pack-objects.c
rename to builtin/pack-objects.c
diff --git a/builtin-pack-redundant.c b/builtin/pack-redundant.c
similarity index 100%
rename from builtin-pack-redundant.c
rename to builtin/pack-redundant.c
diff --git a/builtin-pack-refs.c b/builtin/pack-refs.c
similarity index 100%
rename from builtin-pack-refs.c
rename to builtin/pack-refs.c
diff --git a/builtin-patch-id.c b/builtin/patch-id.c
similarity index 100%
rename from builtin-patch-id.c
rename to builtin/patch-id.c
diff --git a/builtin-prune-packed.c b/builtin/prune-packed.c
similarity index 100%
rename from builtin-prune-packed.c
rename to builtin/prune-packed.c
diff --git a/builtin-prune.c b/builtin/prune.c
similarity index 100%
rename from builtin-prune.c
rename to builtin/prune.c
diff --git a/builtin-push.c b/builtin/push.c
similarity index 100%
rename from builtin-push.c
rename to builtin/push.c
diff --git a/builtin-read-tree.c b/builtin/read-tree.c
similarity index 100%
rename from builtin-read-tree.c
rename to builtin/read-tree.c
diff --git a/builtin-receive-pack.c b/builtin/receive-pack.c
similarity index 100%
rename from builtin-receive-pack.c
rename to builtin/receive-pack.c
diff --git a/builtin-reflog.c b/builtin/reflog.c
similarity index 100%
rename from builtin-reflog.c
rename to builtin/reflog.c
diff --git a/builtin-remote.c b/builtin/remote.c
similarity index 100%
rename from builtin-remote.c
rename to builtin/remote.c
diff --git a/builtin-replace.c b/builtin/replace.c
similarity index 100%
rename from builtin-replace.c
rename to builtin/replace.c
diff --git a/builtin-rerere.c b/builtin/rerere.c
similarity index 100%
rename from builtin-rerere.c
rename to builtin/rerere.c
diff --git a/builtin-reset.c b/builtin/reset.c
similarity index 100%
rename from builtin-reset.c
rename to builtin/reset.c
diff --git a/builtin-rev-list.c b/builtin/rev-list.c
similarity index 100%
rename from builtin-rev-list.c
rename to builtin/rev-list.c
diff --git a/builtin-rev-parse.c b/builtin/rev-parse.c
similarity index 100%
rename from builtin-rev-parse.c
rename to builtin/rev-parse.c
diff --git a/builtin-revert.c b/builtin/revert.c
similarity index 100%
rename from builtin-revert.c
rename to builtin/revert.c
diff --git a/builtin-rm.c b/builtin/rm.c
similarity index 100%
rename from builtin-rm.c
rename to builtin/rm.c
diff --git a/builtin-send-pack.c b/builtin/send-pack.c
similarity index 100%
rename from builtin-send-pack.c
rename to builtin/send-pack.c
diff --git a/builtin-shortlog.c b/builtin/shortlog.c
similarity index 100%
rename from builtin-shortlog.c
rename to builtin/shortlog.c
diff --git a/builtin-show-branch.c b/builtin/show-branch.c
similarity index 100%
rename from builtin-show-branch.c
rename to builtin/show-branch.c
diff --git a/builtin-show-ref.c b/builtin/show-ref.c
similarity index 100%
rename from builtin-show-ref.c
rename to builtin/show-ref.c
diff --git a/builtin-stripspace.c b/builtin/stripspace.c
similarity index 100%
rename from builtin-stripspace.c
rename to builtin/stripspace.c
diff --git a/builtin-symbolic-ref.c b/builtin/symbolic-ref.c
similarity index 100%
rename from builtin-symbolic-ref.c
rename to builtin/symbolic-ref.c
diff --git a/builtin-tag.c b/builtin/tag.c
similarity index 100%
rename from builtin-tag.c
rename to builtin/tag.c
diff --git a/builtin-tar-tree.c b/builtin/tar-tree.c
similarity index 100%
rename from builtin-tar-tree.c
rename to builtin/tar-tree.c
diff --git a/builtin-unpack-file.c b/builtin/unpack-file.c
similarity index 100%
rename from builtin-unpack-file.c
rename to builtin/unpack-file.c
diff --git a/builtin-unpack-objects.c b/builtin/unpack-objects.c
similarity index 100%
rename from builtin-unpack-objects.c
rename to builtin/unpack-objects.c
diff --git a/builtin-update-index.c b/builtin/update-index.c
similarity index 100%
rename from builtin-update-index.c
rename to builtin/update-index.c
diff --git a/builtin-update-ref.c b/builtin/update-ref.c
similarity index 100%
rename from builtin-update-ref.c
rename to builtin/update-ref.c
diff --git a/builtin-update-server-info.c b/builtin/update-server-info.c
similarity index 100%
rename from builtin-update-server-info.c
rename to builtin/update-server-info.c
diff --git a/builtin-upload-archive.c b/builtin/upload-archive.c
similarity index 100%
rename from builtin-upload-archive.c
rename to builtin/upload-archive.c
diff --git a/builtin-var.c b/builtin/var.c
similarity index 100%
rename from builtin-var.c
rename to builtin/var.c
diff --git a/builtin-verify-pack.c b/builtin/verify-pack.c
similarity index 100%
rename from builtin-verify-pack.c
rename to builtin/verify-pack.c
diff --git a/builtin-verify-tag.c b/builtin/verify-tag.c
similarity index 100%
rename from builtin-verify-tag.c
rename to builtin/verify-tag.c
diff --git a/builtin-write-tree.c b/builtin/write-tree.c
similarity index 100%
rename from builtin-write-tree.c
rename to builtin/write-tree.c
Junio C Hamano· Feb 22, 2010, 22:32 UTC · re: Linus Torvalds · lore

Re: [RFD] Deepen the git directory structure a bit.

I'll queue with a trivial addition of "rm builtin/*.o" to the "make clean" target. I am not looking forward to merging the result of this with other topics, though... X-<.

Fabian Kössel· Feb 25, 2010, 10:58 UTC · re: Junio C Hamano · lore

Re: [RFD] Deepen the git directory structure a bit.

On 22.02.2010 23:32, Junio C Hamano wrote:
> I'll queue with a trivial addition of "rm builtin/*.o" to the "make
clean"
> target.  I am not looking forward to merging the result of this with
other
> topics, though... X-<.

Just out of curiosity, how do you actually merge such a relatively big rename with other branches?

I haven't found a pleasant way yet to merge rename+modification in one branch and modification on an old path in another branch.

There is git file-merge theirs base ours . But it only seems to take filenames and no git object specifications. It would be very handy if something like

git file-merge bfile HEAD^:afile afile
would be possible.
For clearification, here an example
echo "First line" > afile

git add . git commit -m "First commit in master"

git checkout -b mybranch

echo "Second line in mybranch" >> afile git mv afile bfile

git commit -a -m "Change and rename in mybranch"
git checkout master
echo "Changed first line in master" > afile
git commit -a -m "changed afile"
git merge mybranch
Regards
Fabian
Junio C Hamano· Feb 27, 2010, 01:28 UTC · re: Fabian Kössel · lore

Re: [RFD] Deepen the git directory structure a bit.

Fabian Kössel <mok4sin@googlemail.com> writes:
Show 9 quoted lines
> On 22.02.2010 23:32, Junio C Hamano wrote:
>> I'll queue with a trivial addition of "rm builtin/*.o" to the "make
> clean"
>> target.  I am not looking forward to merging the result of this with
> other
>> topics, though... X-<.
>
> Just out of curiosity, how do you actually merge such a relatively big
> rename with other branches?

For git.git, existing files are not so troublesome. merge-recursive knows how to handle renames, so does "am -3", but the latter is tricky when the contributor based a patch on some unknown vintage of the source.

A topic with a new builtin command is a bit problematic and no mechanical merge would help. I suspect that no other SCM would be able to either.

 - A topic that adds builtin-frotz.c has an entry that describes how to
   build builtin-frotz.o in Makefile, somewhere near Linus's topic changes
   an existing builtin-nitfol.o to builtin/nitfol.o.  The topic would have
   added the new target already, and then we are merging Linus's topic.
   The merge will conflict.  Every time I rebuild 'pu', this conflict will
   reappear over and over.
   But once the conflict is resolved, rerere will remember it for me, so
   this is not a big problem.
 - A new builtin-frotz.c file in such a topic is more problematic.
   Linus's patch does not know anything about it, so it will merge
   cleanly, but the merge will not move it to builtin/frotz.c; this needs
   to be fixed manually as an evil merge.
   I have automated such an evil merge so that I can rebuild 'pu' without
   manual intervention.

← back to recent threads