Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 Documentation/git-pack-objects.txt |  4 ++++
 builtin/pack-objects.c             | 26 ++++++++++++++++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/Documentation/git-pack-objects.txt 
b/Documentation/git-pack-objects.txt
index cdab9ed..8aae3b5 100644
--- a/Documentation/git-pack-objects.txt
+++ b/Documentation/git-pack-objects.txt
@@ -117,6 +117,10 @@ base-name::
        has a .keep file to be ignored, even if it would have
        otherwise been packed.
 
+--keep::
+       Before moving the index into its final destination
+       create an empty .keep file for the associated pack file.
+
 --incremental::
        This flag causes an object already in a pack to be ignored
        even if it would have otherwise been packed.
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 1fb972f..46c7a57 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -57,6 +57,7 @@ static int num_preferred_base;
 static struct progress *progress_state;
 static int pack_compression_level = Z_DEFAULT_COMPRESSION;
 static int pack_compression_seen;
+static int keep_pack;
 
 static struct packed_git *reuse_packfile;
 static uint32_t reuse_packfile_objects;
@@ -745,6 +746,23 @@ static off_t write_reused_pack(struct sha1file *f)
        return reuse_packfile_offset - sizeof(struct pack_header);
 }
 
+static void write_keep_file(const unsigned char *sha1)
+{
+       const char *msg = "pack-objects --keep\n";
+       char name[PATH_MAX];
+       int keep_fd = odb_pack_keep(name, sizeof(name), sha1);
+       if (keep_fd < 0) {
+               if (errno != EEXIST)
+                       die_errno(_("cannot write keep file '%s'"),
+                                 name);
+               return;
+       }
+       write_or_die(keep_fd, msg, strlen(msg));
+       if (close(keep_fd) != 0)
+               die_errno(_("cannot close written keep file '%s'"),
+                         name);
+}
+
 static void write_pack_file(void)
 {
        uint32_t i = 0, j;
@@ -805,6 +823,9 @@ static void write_pack_file(void)
                        struct stat st;
                        char tmpname[PATH_MAX];
 
+                       if (keep_pack)
+                               write_keep_file(sha1);
+
                        /*
                         * Packs are runtime accessed in their mtime
                         * order since newer packs are more likely to contain
@@ -2609,6 +2630,8 @@ int cmd_pack_objects(int argc, const char **argv, const 
char *prefix)
                         N_("use a bitmap index if available to speed up 
counting objects")),
                OPT_BOOL(0, "write-bitmap-index", &write_bitmap_index,
                         N_("write a bitmap index together with the pack 
index")),
+               OPT_BOOL(0, "keep", &keep_pack,
+                        N_("create .keep for the new pack")),
                OPT_END(),
        };
 
@@ -2672,6 +2695,9 @@ int cmd_pack_objects(int argc, const char **argv, const 
char *prefix)
        if (!pack_to_stdout && thin)
                die("--thin cannot be used to build an indexable pack.");
 
+       if (pack_to_stdout && keep_pack)
+               die("--keep cannot be used with --stdout");
+
        if (keep_unreachable && unpack_unreachable)
                die("--keep-unreachable and --unpack-unreachable are 
incompatible.");
 
-- 
1.9.0.40.gaa8c3ea

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to