From: Matthias Lederhofer <matled@gmx.net>
To: git@vger.kernel.org
Subject: [PATCH] prune-packed: new option --min-age=N
Date: Thu, 18 Jan 2007 18:18:30 +0100 [thread overview]
Message-ID: <20070118171830.GA13521@moooo.ath.cx> (raw)
This option makes prune-packed ignore all packs younger than N seconds
(using mtime).
Signed-off-by: Matthias Lederhofer <matled@gmx.net>
---
This option allows to remove the unpacked version of an object only if
it has been packed for a minimum time. It is intended to work around
the problem of freshly packed objects which should not be deleted
because someone might still try to open the unpacked version.
if [ $(git count-objects | cut -d ' ' -f 3) -gt 10240 ]; then
git repack
fi
git prune-packed --min-age=$((24*60*60))
---
builtin-prune-packed.c | 48 +++++++++++++++++++++++++++++++++++++++++++-----
builtin-prune.c | 2 +-
builtin.h | 2 +-
3 files changed, 45 insertions(+), 7 deletions(-)
diff --git a/builtin-prune-packed.c b/builtin-prune-packed.c
index a57b76d..4359a41 100644
--- a/builtin-prune-packed.c
+++ b/builtin-prune-packed.c
@@ -7,7 +7,8 @@ static const char prune_packed_usage[] =
#define DRY_RUN 01
#define VERBOSE 02
-static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts)
+static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts,
+ char **ignore_packed)
{
struct dirent *de;
char hex[40];
@@ -20,7 +21,7 @@ static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts)
memcpy(hex+2, de->d_name, 38);
if (get_sha1_hex(hex, sha1))
continue;
- if (!has_sha1_pack(sha1, NULL))
+ if (!has_sha1_pack(sha1, ignore_packed))
continue;
memcpy(pathname + len, de->d_name, 38);
if (opts & DRY_RUN)
@@ -32,12 +33,46 @@ static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts)
rmdir(pathname);
}
-void prune_packed_objects(int opts)
+static char **prune_ignore(int min_age, int opts)
+{
+ int ignore_max = 10;
+ int ignore_count = 0;
+ char **ignore_packed = xcalloc(ignore_max, sizeof(char*));
+ int now = time(NULL);
+ struct packed_git *p;
+
+ prepare_packed_git();
+ for (p = packed_git; p; p = p->next) {
+ struct stat s;
+ if (stat(p->pack_name, &s)) {
+ warn("unable to stat %s", p->pack_name);
+ continue;
+ }
+ if (now-s.st_mtime >= min_age)
+ continue;
+ if (opts & VERBOSE)
+ fprintf(stderr, "ignoring pack %s\n", p->pack_name);
+ if (ignore_count >= ignore_max-1) {
+ ignore_max += 10;
+ ignore_packed = xrealloc(ignore_packed,
+ ignore_max*sizeof(char*));
+ }
+ ignore_packed[ignore_count++] = p->pack_name;
+ }
+ ignore_packed[ignore_count] = NULL;
+ return ignore_packed;
+}
+
+void prune_packed_objects(int opts, int min_age)
{
int i;
static char pathname[PATH_MAX];
const char *dir = get_object_directory();
int len = strlen(dir);
+ char **ignore_packed = NULL;
+
+ if (min_age > 0)
+ ignore_packed = prune_ignore(min_age, opts);
if (len > PATH_MAX - 42)
die("impossible object directory");
@@ -54,7 +89,7 @@ void prune_packed_objects(int opts)
((i+1) * 100) / 256);
if (!d)
continue;
- prune_dir(i, d, pathname, len + 3, opts);
+ prune_dir(i, d, pathname, len + 3, opts, ignore_packed);
closedir(d);
}
if (opts == VERBOSE)
@@ -65,6 +100,7 @@ int cmd_prune_packed(int argc, const char **argv, const char *prefix)
{
int i;
int opts = VERBOSE;
+ int min_age = 0;
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
@@ -74,6 +110,8 @@ int cmd_prune_packed(int argc, const char **argv, const char *prefix)
opts |= DRY_RUN;
else if (!strcmp(arg, "-q"))
opts &= ~VERBOSE;
+ else if (!strncmp(arg, "--min-age=", 10))
+ min_age = atoi(arg+10);
else
usage(prune_packed_usage);
continue;
@@ -82,6 +120,6 @@ int cmd_prune_packed(int argc, const char **argv, const char *prefix)
usage(prune_packed_usage);
}
sync();
- prune_packed_objects(opts);
+ prune_packed_objects(opts, min_age);
return 0;
}
diff --git a/builtin-prune.c b/builtin-prune.c
index 6f0ba0d..46a0fe5 100644
--- a/builtin-prune.c
+++ b/builtin-prune.c
@@ -100,6 +100,6 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
prune_object_dir(get_object_directory());
sync();
- prune_packed_objects(show_only);
+ prune_packed_objects(show_only, 0);
return 0;
}
diff --git a/builtin.h b/builtin.h
index 818c7bf..e9929da 100644
--- a/builtin.h
+++ b/builtin.h
@@ -11,7 +11,7 @@ extern int mailinfo(FILE *in, FILE *out, int ks, const char *encoding, const cha
extern int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip);
extern void stripspace(FILE *in, FILE *out);
extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
-extern void prune_packed_objects(int);
+extern void prune_packed_objects(int, int);
extern int cmd_add(int argc, const char **argv, const char *prefix);
extern int cmd_annotate(int argc, const char **argv, const char *prefix);
--
1.4.4.4
next reply other threads:[~2007-01-18 17:18 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-01-18 17:18 Matthias Lederhofer [this message]
2007-01-18 17:24 ` [PATCH] prune-packed: new option --min-age=N Shawn O. Pearce
2007-01-18 17:42 ` Matthias Lederhofer
2007-01-18 17:51 ` Shawn O. Pearce
2007-01-18 22:29 ` [RFC] prune: --expire=seconds Matthias Lederhofer
2007-01-18 22:32 ` Junio C Hamano
2007-01-19 3:44 ` Shawn O. Pearce
2007-01-19 10:49 ` [PATCH] prune: --expire=time Matthias Lederhofer
2007-01-19 15:41 ` Nicolas Pitre
2007-01-19 19:18 ` Junio C Hamano
2007-01-20 11:18 ` Matthias Lederhofer
2007-01-21 6:55 ` Junio C Hamano
2007-01-21 7:53 ` Shawn O. Pearce
2007-01-21 10:37 ` Matthias Lederhofer
2007-01-21 11:17 ` Junio C Hamano
2007-01-21 22:01 ` Jeff King
2007-01-22 1:38 ` Steven Grimm
2007-01-22 1:52 ` Jeff King
2007-01-22 2:06 ` Junio C Hamano
2007-01-22 2:23 ` Linus Torvalds
2007-01-22 2:40 ` Junio C Hamano
2007-01-22 2:58 ` Linus Torvalds
2007-01-22 5:17 ` Junio C Hamano
2007-01-22 6:26 ` Linus Torvalds
2007-01-22 6:57 ` Shawn O. Pearce
2007-01-22 7:12 ` Junio C Hamano
2007-01-22 9:32 ` Jakub Narebski
2007-01-22 3:26 ` [PATCH] v1.5.0.txt: update description of git-gc Jeff King
2007-01-22 2:03 ` [PATCH] prune: --expire=time Junio C Hamano
2007-01-20 12:06 ` Simon 'corecode' Schubert
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=20070118171830.GA13521@moooo.ath.cx \
--to=matled@gmx.net \
--cc=git@vger.kernel.org \
/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).