From: Junio C Hamano <gitster@pobox.com>
To: "Andreas Färber" <andreas.faerber@web.de>
Cc: git@vger.kernel.org, Johannes Sixt <johannes.sixt@telecom.at>
Subject: [PATCH] compat: introduce stat_to_kilobytes
Date: Sun, 17 Aug 2008 02:47:04 -0700 [thread overview]
Message-ID: <7vy72w6kiv.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <273481A4-0BB2-4A58-83AD-604B425DE824@web.de> (Andreas Färber's message of "Sun, 17 Aug 2008 10:59:35 +0200")
Some platforms do not have st_blocks member in "struct stat"; mingw
already emulates it by rounding it up to closest 512-byte blocks (even
though it could overcount when a file has holes).
The reason to use the member is only to figure out how many kilobytes the
file occupies on-disk, so give a helper in git-compat-util.h to help these
platforms.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
* I suspect you may be better off building on top of something like
this.
The comment before "struct mingw_stat" suggests that the only reason
this compatiblity definition exists is to add st_blocks member, so I
suspect we could remove the definition and simplify the compatibility
layer a lot more, but I do not know MinGW, so I am CC'ing j6t here.
Makefile | 4 ++++
builtin-count-objects.c | 4 ++--
compat/mingw.c | 8 --------
compat/mingw.h | 1 -
git-compat-util.h | 6 ++++++
5 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/Makefile b/Makefile
index 53ab4b5..8f69f16 100644
--- a/Makefile
+++ b/Makefile
@@ -124,6 +124,9 @@ all::
# Define USE_STDEV below if you want git to care about the underlying device
# change being considered an inode change from the update-index perspective.
#
+# Define NO_ST_BLOCKS_IN_STRUCT_STAT if your platform does not have st_blocks
+# field that counts the on-disk footprint in 512-byte blocks.
+#
# Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8
#
# Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72.
@@ -749,6 +752,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
NO_SVN_TESTS = YesPlease
NO_PERL_MAKEMAKER = YesPlease
NO_POSIX_ONLY_PROGRAMS = YesPlease
+ NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat
COMPAT_CFLAGS += -DSNPRINTF_SIZE_CORR=1
COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
diff --git a/builtin-count-objects.c b/builtin-count-objects.c
index 91b5487..07ab0a0 100644
--- a/builtin-count-objects.c
+++ b/builtin-count-objects.c
@@ -43,7 +43,7 @@ static void count_objects(DIR *d, char *path, int len, int verbose,
if (lstat(path, &st) || !S_ISREG(st.st_mode))
bad = 1;
else
- (*loose_size) += xsize_t(st.st_blocks);
+ (*loose_size) += xsize_t(stat_to_kilobytes(st));
}
if (bad) {
if (verbose) {
@@ -115,7 +115,7 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix)
num_pack++;
}
printf("count: %lu\n", loose);
- printf("size: %lu\n", loose_size / 2);
+ printf("size: %lu\n", loose_size);
printf("in-pack: %lu\n", packed);
printf("packs: %lu\n", num_pack);
printf("prune-packable: %lu\n", packed_loose);
diff --git a/compat/mingw.c b/compat/mingw.c
index 772cad5..798fb61 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -31,11 +31,6 @@ static inline time_t filetime_to_time_t(const FILETIME *ft)
return (time_t)winTime;
}
-static inline size_t size_to_blocks(size_t s)
-{
- return (s+511)/512;
-}
-
extern int _getdrive( void );
/* We keep the do_lstat code in a separate function to avoid recursion.
* When a path ends with a slash, the stat will fail with ENOENT. In
@@ -59,7 +54,6 @@ static int do_lstat(const char *file_name, struct stat *buf)
buf->st_uid = 0;
buf->st_mode = fMode;
buf->st_size = fdata.nFileSizeLow; /* Can't use nFileSizeHigh, since it's not a stat64 */
- buf->st_blocks = size_to_blocks(buf->st_size);
buf->st_dev = _getdrive() - 1;
buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
@@ -142,7 +136,6 @@ int mingw_fstat(int fd, struct mingw_stat *buf)
buf->st_uid = st.st_uid;
buf->st_mode = st.st_mode;
buf->st_size = st.st_size;
- buf->st_blocks = size_to_blocks(buf->st_size);
buf->st_dev = st.st_dev;
buf->st_atime = st.st_atime;
buf->st_mtime = st.st_mtime;
@@ -164,7 +157,6 @@ int mingw_fstat(int fd, struct mingw_stat *buf)
buf->st_uid = 0;
buf->st_mode = fMode;
buf->st_size = fdata.nFileSizeLow; /* Can't use nFileSizeHigh, since it's not a stat64 */
- buf->st_blocks = size_to_blocks(buf->st_size);
buf->st_dev = _getdrive() - 1;
buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
diff --git a/compat/mingw.h b/compat/mingw.h
index a52e657..1472d59 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -169,7 +169,6 @@ struct mingw_stat {
time_t st_mtime, st_atime, st_ctime;
unsigned st_dev, st_ino, st_uid, st_gid;
size_t st_size;
- size_t st_blocks;
};
int mingw_lstat(const char *file_name, struct mingw_stat *buf);
int mingw_fstat(int fd, struct mingw_stat *buf);
diff --git a/git-compat-util.h b/git-compat-util.h
index cf89cdf..8ef3a72 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -192,6 +192,12 @@ extern int git_munmap(void *start, size_t length);
#endif /* NO_MMAP */
+#ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
+#define stat_to_kilobytes(st) ((((st).st_size+511) / 512) / 2)
+#else
+#define stat_to_kilobytes(st) ((st).st_blocks / 2)
+#endif
+
#define DEFAULT_PACKED_GIT_LIMIT \
((1024L * 1024L) * (sizeof(void*) >= 8 ? 8192 : 256))
--
1.6.0.rc3.22.g053f
next prev parent reply other threads:[~2008-08-17 9:51 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-17 8:59 [PATCH 4/6] Don't use struct stat's st_blocks member on Haiku Andreas Färber
2008-08-17 9:28 ` Jakub Narebski
2008-08-17 9:47 ` Junio C Hamano [this message]
2008-08-17 17:27 ` [PATCH] compat: introduce stat_to_kilobytes Andreas Färber
2008-08-18 19:57 ` [PATCH 1/2] " Johannes Sixt
2008-08-18 20:01 ` [PATCH 2/2] Revert "Windows: Use a customized struct stat that also has the st_blocks member." Johannes Sixt
2008-08-18 20:44 ` Junio C Hamano
2008-08-18 20:40 ` [PATCH 1/2] compat: introduce stat_to_kilobytes Junio C Hamano
2008-08-19 7:31 ` Junio C Hamano
2008-08-19 8:39 ` Andreas Färber
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=7vy72w6kiv.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=andreas.faerber@web.de \
--cc=git@vger.kernel.org \
--cc=johannes.sixt@telecom.at \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.