From: Peter Hagervall <hager@cs.umu.se>
To: git@vger.kernel.org
Cc: junkio@cox.net
Subject: [PATCH] C version of git-count-objects
Date: Thu, 27 Apr 2006 12:12:55 +0200 [thread overview]
Message-ID: <20060427101254.GA22769@peppar.cs.umu.se> (raw)
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.
Signed-off-by: Peter Hagervall <hager@cs.umu.se>
[1] http://article.gmane.org/gmane.comp.version-control.git/19073
---
Makefile | 5 +--
count-objects.c | 56 +++++++++++++++++++++++++++++++++++++
git-count-objects.sh | 31 --------------------
3 files changed, 59 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..67ab6f0
--- /dev/null
+++ b/count-objects.c
@@ -0,0 +1,56 @@
+#include "cache.h"
+#include "git-compat-util.h"
+
+static char pathname[PATH_MAX + 1];
+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 (access(subdir, R_OK | X_OK))
+ continue;
+ chdir(subdir);
+ if (!(dp = opendir("."))) {
+ error("can't open subdir %s", subdir);
+ 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
next reply other threads:[~2006-04-27 10:13 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-27 10:12 Peter Hagervall [this message]
2006-04-27 13:16 ` [PATCH] C version of git-count-objects Morten Welinder
2006-04-27 13:23 ` Nicolas Pitre
2006-04-27 14:07 ` [PATCH] C version of git-count-objects, second try Peter Hagervall
2006-04-27 18:56 ` [PATCH] C version of git-count-objects Junio C Hamano
2006-04-27 19:39 ` Nicolas Pitre
2006-04-27 19:46 ` Peter Hagervall
2006-04-27 20:07 ` Linus Torvalds
2006-04-27 20:51 ` Peter Hagervall
2006-04-27 22:07 ` Junio C Hamano
2006-04-28 0:10 ` Peter Hagervall
2006-04-28 0:25 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060427101254.GA22769@peppar.cs.umu.se \
--to=hager@cs.umu.se \
--cc=git@vger.kernel.org \
--cc=junkio@cox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).