From: Stefan Beller <stefanbeller@googlemail.com>
To: git@vger.kernel.org, mfick@codeaurora.org, apelisse@gmail.com,
Matthieu.Moy@grenoble-inp.fr, pclouds@gmail.com, iveqy@iveqy.com,
gitster@pobox.com, mackyle@gmail.com, j6t@kdbg.org
Cc: Stefan Beller <stefanbeller@googlemail.com>
Subject: [PATCH] repack: rewrite the shell script in C (squashing proposal)
Date: Thu, 22 Aug 2013 22:06:36 +0200 [thread overview]
Message-ID: <1377201996-27296-1-git-send-email-stefanbeller@googlemail.com> (raw)
In-Reply-To: <5215EC1A.7060004@kdbg.org>
This patch is meant to be squashed into bb4335a21441a0
(repack: rewrite the shell script in C), I'll do so when rerolling
the series. For reviewing I'll just send this patch.
* Remove comments, which likely get out of date (authorship is kept in
git anyway)
* rename get_pack_filenames to get_non_kept_pack_filenames
* catch return value of unlink and fail as the shell version did
* beauty fixes to remove_temporary_files as Junio proposed
* install signal handling after static variables packdir, packtmp are set
* remove adding the empty string to the buffer.
* fix the rollback mechanism (wrong variable name)
Signed-off-by: Stefan Beller <stefanbeller@googlemail.com>
---
builtin/repack.c | 78 ++++++++++++++++++++++++++------------------------------
1 file changed, 36 insertions(+), 42 deletions(-)
diff --git a/builtin/repack.c b/builtin/repack.c
index 1f13e0d..e0d1f17 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -1,8 +1,3 @@
-/*
- * The shell version was written by Linus Torvalds (2005) and many others.
- * This is a translation into C by Stefan Beller (2013)
- */
-
#include "builtin.h"
#include "cache.h"
#include "dir.h"
@@ -13,9 +8,8 @@
#include "string-list.h"
#include "argv-array.h"
-/* enabled by default since 22c79eab (2008-06-25) */
static int delta_base_offset = 1;
-char *packdir;
+static char *packdir, *packtmp;
static const char *const git_repack_usage[] = {
N_("git repack [options]"),
@@ -41,18 +35,16 @@ static void remove_temporary_files(void)
DIR *dir;
struct dirent *e;
- /* .git/objects/pack */
- strbuf_addstr(&buf, get_object_directory());
- strbuf_addstr(&buf, "/pack");
- dir = opendir(buf.buf);
- if (!dir) {
- strbuf_release(&buf);
+ dir = opendir(packdir);
+ if (!dir)
return;
- }
- /* .git/objects/pack/.tmp-$$-pack-* */
+ strbuf_addstr(&buf, packdir);
+
+ /* dirlen holds the length of the path before the file name */
dirlen = buf.len + 1;
- strbuf_addf(&buf, "/.tmp-%d-pack-", (int)getpid());
+ strbuf_addf(&buf, "%s", packtmp);
+ /* prefixlen holds the length of the prefix */
prefixlen = buf.len - dirlen;
while ((e = readdir(dir))) {
@@ -73,11 +65,16 @@ static void remove_pack_on_signal(int signo)
raise(signo);
}
-static void get_pack_filenames(struct string_list *fname_list)
+/*
+ * Adds all packs hex strings to the fname list, which do not
+ * have a corresponding .keep file.
+ */
+static void get_non_kept_pack_filenames(struct string_list *fname_list)
{
DIR *dir;
struct dirent *e;
char *fname;
+ size_t len;
if (!(dir = opendir(packdir)))
return;
@@ -86,7 +83,7 @@ static void get_pack_filenames(struct string_list *fname_list)
if (suffixcmp(e->d_name, ".pack"))
continue;
- size_t len = strlen(e->d_name) - strlen(".pack");
+ len = strlen(e->d_name) - strlen(".pack");
fname = xmemdupz(e->d_name, len);
if (!file_exists(mkpath("%s/%s.keep", packdir, fname)))
@@ -95,14 +92,14 @@ static void get_pack_filenames(struct string_list *fname_list)
closedir(dir);
}
-static void remove_redundant_pack(const char *path, const char *sha1)
+static void remove_redundant_pack(const char *path_prefix, const char *hex)
{
const char *exts[] = {".pack", ".idx", ".keep"};
int i;
struct strbuf buf = STRBUF_INIT;
size_t plen;
- strbuf_addf(&buf, "%s/%s", path, sha1);
+ strbuf_addf(&buf, "%s/%s", path_prefix, hex);
plen = buf.len;
for (i = 0; i < ARRAY_SIZE(exts); i++) {
@@ -115,15 +112,14 @@ static void remove_redundant_pack(const char *path, const char *sha1)
int cmd_repack(int argc, const char **argv, const char *prefix)
{
const char *exts[2] = {".idx", ".pack"};
- char *packtmp;
struct child_process cmd;
struct string_list_item *item;
struct argv_array cmd_args = ARGV_ARRAY_INIT;
struct string_list names = STRING_LIST_INIT_DUP;
- struct string_list rollback = STRING_LIST_INIT_DUP;
+ struct string_list rollback = STRING_LIST_INIT_NODUP;
struct string_list existing_packs = STRING_LIST_INIT_DUP;
struct strbuf line = STRBUF_INIT;
- int count_packs, ext, ret;
+ int nr_packs, ext, ret, failed;
FILE *out;
/* variables to be filled by option parsing */
@@ -173,11 +169,11 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, builtin_repack_options,
git_repack_usage, 0);
- sigchain_push_common(remove_pack_on_signal);
-
packdir = mkpathdup("%s/pack", get_object_directory());
packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
+ sigchain_push_common(remove_pack_on_signal);
+
argv_array_push(&cmd_args, "pack-objects");
argv_array_push(&cmd_args, "--keep-true-parents");
argv_array_push(&cmd_args, "--honor-pack-keep");
@@ -201,7 +197,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argv_array_push(&cmd_args, "--unpacked");
argv_array_push(&cmd_args, "--incremental");
} else {
- get_pack_filenames(&existing_packs);
+ get_non_kept_pack_filenames(&existing_packs);
if (existing_packs.nr && delete_redundant) {
if (unpack_unreachable)
@@ -233,14 +229,13 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
if (ret)
return ret;
- count_packs = 0;
+ nr_packs = 0;
out = xfdopen(cmd.out, "r");
while (strbuf_getline(&line, out, '\n') != EOF) {
if (line.len != 40)
die("repack: Expecting 40 character sha1 lines only from pack-objects.");
- strbuf_addstr(&line, "");
string_list_append(&names, line.buf);
- count_packs++;
+ nr_packs++;
}
fclose(out);
ret = finish_command(&cmd);
@@ -248,10 +243,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
return ret;
argv_array_clear(&cmd_args);
- if (!count_packs && !quiet)
+ if (!nr_packs && !quiet)
printf("Nothing new to pack.\n");
- int failed = 0;
+ failed = 0;
for_each_string_list_item(item, &names) {
for (ext = 0; ext < 2; ext++) {
char *fname, *fname_old;
@@ -262,24 +257,23 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
continue;
}
- fname_old = mkpathdup("%s/old-%s%s", packdir,
+ fname_old = mkpath("%s/old-%s%s", packdir,
item->string, exts[ext]);
if (file_exists(fname_old))
- unlink(fname_old);
+ if (unlink(fname_old))
+ failed = 1;
- if (rename(fname, fname_old)) {
+ if (!failed && rename(fname, fname_old)) {
failed = 1;
break;
}
- string_list_append_nodup(&rollback, fname);
- free(fname);
- free(fname_old);
+ string_list_append(&rollback, fname);
}
if (failed)
break;
}
if (failed) {
- struct string_list rollback_failure;
+ struct string_list rollback_failure = STRING_LIST_INIT_DUP;
for_each_string_list_item(item, &rollback) {
char *fname, *fname_old;
fname = mkpathdup("%s/%s", packdir, item->string);
@@ -289,7 +283,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
free(fname);
}
- if (rollback.nr) {
+ if (rollback_failure.nr) {
int i;
fprintf(stderr,
"WARNING: Some packs in use have been renamed by\n"
@@ -299,10 +293,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
"WARNING: attempt to rename them back to their\n"
"WARNING: original names also failed.\n"
"WARNING: Please rename them in %s manually:\n", packdir);
- for (i = 0; i < rollback.nr; i++)
+ for (i = 0; i < rollback_failure.nr; i++)
fprintf(stderr, "WARNING: old-%s -> %s\n",
- rollback.items[i].string,
- rollback.items[i].string);
+ rollback_failure.items[i].string,
+ rollback_failure.items[i].string);
}
exit(1);
}
--
1.8.4.rc3.1.gc1ebd90
next prev parent reply other threads:[~2013-08-22 20:06 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-13 19:23 [PATCH] Rewriting git-repack in C Stefan Beller
2013-08-13 19:23 ` [PATCH] repack: rewrite the shell script " Stefan Beller
2013-08-14 7:26 ` Matthieu Moy
2013-08-14 16:26 ` Stefan Beller
2013-08-14 16:27 ` [RFC PATCH] " Stefan Beller
2013-08-14 16:49 ` Antoine Pelisse
2013-08-14 17:04 ` Stefan Beller
2013-08-14 17:19 ` Jeff King
2013-08-14 17:25 ` Martin Fick
2013-08-14 22:16 ` Stefan Beller
2013-08-14 22:28 ` Martin Fick
2013-08-14 22:53 ` Junio C Hamano
2013-08-14 23:28 ` Martin Fick
2013-08-15 17:15 ` Junio C Hamano
2013-08-16 0:12 ` [RFC PATCHv2] " Stefan Beller
2013-08-17 13:34 ` René Scharfe
2013-08-17 19:18 ` Kyle J. McKay
2013-08-18 14:34 ` Stefan Beller
2013-08-18 14:36 ` [RFC PATCHv3] " Stefan Beller
2013-08-18 15:41 ` Kyle J. McKay
2013-08-18 16:44 ` René Scharfe
2013-08-18 22:26 ` [RFC PATCHv4] " Stefan Beller
2013-08-19 23:23 ` Stefan Beller
2013-08-20 13:31 ` Johannes Sixt
2013-08-20 15:08 ` Stefan Beller
2013-08-20 18:38 ` Johannes Sixt
2013-08-20 18:57 ` René Scharfe
2013-08-20 22:36 ` Stefan Beller
2013-08-20 22:38 ` [PATCH] " Stefan Beller
2013-08-21 8:25 ` Jonathan Nieder
2013-08-21 10:37 ` Stefan Beller
2013-08-21 17:25 ` Stefan Beller
2013-08-21 17:28 ` [RFC PATCHv6 1/2] " Stefan Beller
2013-08-21 17:28 ` [RFC PATCHv6 2/2] repack: retain the return value of pack-objects Stefan Beller
2013-08-21 20:56 ` [RFC PATCHv6 1/2] repack: rewrite the shell script in C Junio C Hamano
2013-08-21 21:52 ` Matthieu Moy
2013-08-21 22:15 ` Stefan Beller
2013-08-21 22:50 ` Junio C Hamano
2013-08-21 22:57 ` Stefan Beller
2013-08-22 10:46 ` Johannes Sixt
2013-08-22 21:03 ` Jonathan Nieder
2013-08-21 8:49 ` [PATCH] " Matthieu Moy
2013-08-21 12:47 ` Stefan Beller
2013-08-21 13:05 ` Matthieu Moy
2013-08-21 12:53 ` Stefan Beller
2013-08-21 13:07 ` Matthieu Moy
2013-08-22 10:46 ` Johannes Sixt
2013-08-22 10:46 ` Johannes Sixt
2013-08-22 20:06 ` Stefan Beller [this message]
2013-08-22 20:31 ` [PATCH] repack: rewrite the shell script in C (squashing proposal) Junio C Hamano
2013-08-20 22:46 ` [RFC PATCHv4] repack: rewrite the shell script in C Jonathan Nieder
2013-08-21 9:20 ` Johannes Sixt
2013-08-20 21:24 ` Stefan Beller
2013-08-20 21:34 ` Jonathan Nieder
2013-08-20 21:40 ` Dokumenting api-paths.txt Stefan Beller
2013-08-20 21:59 ` Jonathan Nieder
2013-08-21 22:43 ` Stefan Beller
2013-08-22 17:29 ` Junio C Hamano
2013-08-14 22:51 ` [RFC PATCH] repack: rewrite the shell script in C Junio C Hamano
2013-08-14 22:59 ` Matthieu Moy
2013-08-15 7:47 ` Stefan Beller
2013-08-15 4:15 ` Duy Nguyen
2013-08-14 17:26 ` Junio C Hamano
2013-08-14 22:51 ` Matthieu Moy
2013-08-14 23:25 ` Martin Fick
2013-08-15 0:26 ` Martin Fick
2013-08-15 7:46 ` Stefan Beller
2013-08-15 15:04 ` Martin Fick
2013-08-15 4:20 ` Duy Nguyen
2013-08-14 17:04 ` Junio C Hamano
2013-08-15 7:53 ` Stefan Beller
2013-08-14 7:12 ` [PATCH] Rewriting git-repack " Matthieu Moy
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1377201996-27296-1-git-send-email-stefanbeller@googlemail.com \
--to=stefanbeller@googlemail.com \
--cc=Matthieu.Moy@grenoble-inp.fr \
--cc=apelisse@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=iveqy@iveqy.com \
--cc=j6t@kdbg.org \
--cc=mackyle@gmail.com \
--cc=mfick@codeaurora.org \
--cc=pclouds@gmail.com \
/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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).