On Thu, Apr 27, 2006 at 09:23:47AM -0400, Nicolas Pitre wrote: > On Thu, 27 Apr 2006, Peter Hagervall wrote: > > > Answering the call Linus made[1], sort of, but for a completely > > different program. > > > > Anyway, it ought to be at least as portable as the shell script, and a > > whole lot faster, however much that matters. > > > [...] > > + for (i = 0; i < 16; i++) { > > + subdir[0] = hex_digits[i]; > > + for (j = 0; j < 16; j++) { > > + subdir[1] = hex_digits[j]; > > + if (access(subdir, R_OK | X_OK)) > > + continue; > > + chdir(subdir); > > + if (!(dp = opendir("."))) { > > + error("can't open subdir %s", subdir); > > + continue; > > + } > > Looks like you're missing a chdir(".."); there. > Thanks, I overlooked that one (and the race condition pointed out by Morten). Anyway, fixed those now, and removed an unused array. Signed-off-by: Peter Hagervall <hager@xxxxxxxxx> --- Makefile | 5 ++- count-objects.c | 55 +++++++++++++++++++++++++++++++++++++ git-count-objects.sh | 31 -------------------- 3 files changed, 58 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index 8ce27a6..53e7591 100644 --- a/Makefile +++ b/Makefile @@ -115,7 +115,7 @@ ### --- END CONFIGURATION SECTION --- SCRIPT_SH = \ git-add.sh git-bisect.sh git-branch.sh git-checkout.sh \ git-cherry.sh git-clean.sh git-clone.sh git-commit.sh \ - git-count-objects.sh git-diff.sh git-fetch.sh \ + git-diff.sh git-fetch.sh \ git-format-patch.sh git-ls-remote.sh \ git-merge-one-file.sh git-parse-remote.sh \ git-prune.sh git-pull.sh git-push.sh git-rebase.sh \ @@ -165,7 +165,8 @@ PROGRAMS = \ git-upload-pack$X git-verify-pack$X git-write-tree$X \ git-update-ref$X git-symbolic-ref$X git-check-ref-format$X \ git-name-rev$X git-pack-redundant$X git-repo-config$X git-var$X \ - git-describe$X git-merge-tree$X git-blame$X git-imap-send$X + git-describe$X git-merge-tree$X git-blame$X git-imap-send$X \ + git-count-objects$X BUILT_INS = git-log$X diff --git a/count-objects.c b/count-objects.c new file mode 100644 index 0000000..beaa4d9 --- /dev/null +++ b/count-objects.c @@ -0,0 +1,55 @@ +#include "cache.h" +#include "git-compat-util.h" + +static int numobjects, numblocks; +static const char hex_digits[] = "0123456789abcdef"; + +void count_objects(void) +{ + char subdir[3]; + int i, j; + struct stat statbuf; + struct dirent *dirp; + DIR *dp; + subdir[2] = '\0'; + for (i = 0; i < 16; i++) { + subdir[0] = hex_digits[i]; + for (j = 0; j < 16; j++) { + subdir[1] = hex_digits[j]; + if (chdir(subdir)) + continue; + if (!(dp = opendir("."))) { + error("can't open subdir %s", subdir); + chdir(".."); + continue; + } + while ((dirp = readdir(dp))) { + if (!strcmp(dirp->d_name, ".") || + !strcmp(dirp->d_name, "..")) + continue; + if (lstat(dirp->d_name, &statbuf)) { + error("can't stat file %s", dirp->d_name); + continue; + } + numblocks += statbuf.st_blocks; + numobjects++; + } + closedir(dp); + chdir(".."); + } + } +} + +int main(int argc, char **argv) +{ + setup_git_directory(); + + if (chdir(".git/objects")) + die("%s", strerror(errno)); + + count_objects(); + + printf("%d objects, %d kilobytes\n", numobjects, numblocks / 2); + + return 0; +} diff --git a/git-count-objects.sh b/git-count-objects.sh deleted file mode 100755 index 40c58ef..0000000 --- a/git-count-objects.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2005 Junio C Hamano -# - -GIT_DIR=`git-rev-parse --git-dir` || exit $? - -dc </dev/null 2>/dev/null || { - # This is not a real DC at all -- it just knows how - # this script feeds DC and does the computation itself. - dc () { - while read a b - do - case $a,$b in - 0,) acc=0 ;; - *,+) acc=$(($acc + $a)) ;; - p,) echo "$acc" ;; - esac - done - } -} - -echo $(find "$GIT_DIR/objects"/?? -type f -print 2>/dev/null | wc -l) objects, \ -$({ - echo 0 - # "no-such" is to help Darwin folks by not using xargs -r. - find "$GIT_DIR/objects"/?? -type f -print 2>/dev/null | - xargs du -k "$GIT_DIR/objects/no-such" 2>/dev/null | - sed -e 's/[ ].*/ +/' - echo p -} | dc) kilobytes - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html