Make sure objects/pack exists before creating a new pack
commit6e180cdcecbb3e828aa892925d7ef67abf81ad80
authorJunio C Hamano <gitster@pobox.com>
Wed, 25 Feb 2009 07:11:29 +0000 (24 23:11 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Feb 2009 22:39:42 +0000 (25 14:39 -0800)
treea351bdda2ecb3ba6db58a56fe81daa1a24024590
parent718258e256b74622aa55f5ee0cb9cff4cce6bf9f
Make sure objects/pack exists before creating a new pack

In a repository created with git older than f49fb35 (git-init-db: create
"pack" subdirectory under objects, 2005-06-27), objects/pack/ directory is
not created upon initialization.  It was Ok because subdirectories are
created as needed inside directories init-db creates, and back then,
packfiles were recent invention.

After the said commit, new codepaths started relying on the presense of
objects/pack/ directory in the repository.  This was exacerbated with
8b4eb6b (Do not perform cross-directory renames when creating packs,
2008-09-22) that moved the location temporary pack files are created from
objects/ directory to objects/pack/ directory, because moving temporary to
the final location was done carefully with lazy leading directory creation.

Many packfile related operations in such an old repository can fail
mysteriously because of this.

This commit introduces two helper functions to make things work better.

 - odb_mkstemp() is a specialized version of mkstemp() to refactor the
   code and teach it to create leading directories as needed;

 - odb_pack_keep() refactors the code to create a ".keep" file while
   create leading directories as needed.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-pack-objects.c
fast-import.c
git-compat-util.h
index-pack.c
pack-write.c
t/t5300-pack-object.sh
wrapper.c