summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2008-10-21 13:47:22 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2008-10-21 13:47:22 -0700
commit20341dd970b331fd721225ca630548ec1e90d8a5 (patch)
tree3f91b069a9dbea638dd751599eed75b1bec926b1
parentMerge branch 'maint' (diff)
parentGIT 1.6.0.3 (diff)
downloadtgif-20341dd970b331fd721225ca630548ec1e90d8a5.tar.xz
Merge branch 'maint'
* maint: GIT 1.6.0.3 rehabilitate 'git index-pack' inside the object store
-rw-r--r--Documentation/RelNotes-1.6.0.3.txt15
-rw-r--r--index-pack.c22
-rwxr-xr-xt/t5302-pack-index.sh10
3 files changed, 35 insertions, 12 deletions
diff --git a/Documentation/RelNotes-1.6.0.3.txt b/Documentation/RelNotes-1.6.0.3.txt
index c0f037d6db..ae0577836a 100644
--- a/Documentation/RelNotes-1.6.0.3.txt
+++ b/Documentation/RelNotes-1.6.0.3.txt
@@ -27,9 +27,6 @@ Fixes since v1.6.0.2
* "git diff" hunk header patterns with multiple elements separated by LF
were not used correctly.
-* "git gc" when ejecting otherwise unreachable objects from packfiles into
- loose form leaked memory.
-
* Hunk headers in "git diff" default to using extended regular
expressions, fixing some of the internal patterns on non-GNU
platforms.
@@ -37,9 +34,15 @@ Fixes since v1.6.0.2
* New config "diff.*.xfuncname" exposes extended regular expressions
for user specified hunk header patterns.
+* "git gc" when ejecting otherwise unreachable objects from packfiles into
+ loose form leaked memory.
+
* "git index-pack" was recently broken and mishandled objects added by
thin-pack completion processing under memory pressure.
+* "git index-pack" was recently broken and misbehaved when run from inside
+ .git/objects/pack/ directory.
+
* "git stash apply sash@{1}" was fixed to error out. Prior versions
would have applied stash@{0} incorrectly.
@@ -112,9 +115,3 @@ Fixes since v1.6.0.2
("git fetch") is still however supported.
Many other documentation updates.
-
---
-exec >/var/tmp/1
-O=v1.6.0.2-110-gf07c3c5
-echo O=$(git describe maint)
-git shortlog --no-merges $O..maint
diff --git a/index-pack.c b/index-pack.c
index aec11cb940..6f89bb9ac7 100644
--- a/index-pack.c
+++ b/index-pack.c
@@ -880,10 +880,26 @@ int main(int argc, char **argv)
char *index_name_buf = NULL, *keep_name_buf = NULL;
struct pack_idx_entry **idx_objects;
unsigned char pack_sha1[20];
- int nongit = 0;
- setup_git_directory_gently(&nongit);
- git_config(git_index_pack_config, NULL);
+ /*
+ * We wish to read the repository's config file if any, and
+ * for that it is necessary to call setup_git_directory_gently().
+ * However if the cwd was inside .git/objects/pack/ then we need
+ * to go back there or all the pack name arguments will be wrong.
+ * And in that case we cannot rely on any prefix returned by
+ * setup_git_directory_gently() either.
+ */
+ {
+ char cwd[PATH_MAX+1];
+ int nongit;
+
+ if (!getcwd(cwd, sizeof(cwd)-1))
+ die("Unable to get current working directory");
+ setup_git_directory_gently(&nongit);
+ git_config(git_index_pack_config, NULL);
+ if (chdir(cwd))
+ die("Cannot come back to cwd");
+ }
for (i = 1; i < argc; i++) {
char *arg = argv[i];
diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh
index 6424db1f28..344ab25b8b 100755
--- a/t/t5302-pack-index.sh
+++ b/t/t5302-pack-index.sh
@@ -177,4 +177,14 @@ test_expect_success \
".git/objects/pack/pack-${pack1}.pack" 2>&1) &&
echo "$err" | grep "CRC mismatch"'
+test_expect_success 'running index-pack in the object store' '
+ rm -f .git/objects/pack/* &&
+ cp test-1-${pack1}.pack .git/objects/pack/pack-${pack1}.pack &&
+ (
+ cd .git/objects/pack
+ git index-pack pack-${pack1}.pack
+ ) &&
+ test -f .git/objects/pack/pack-${pack1}.idx
+'
+
test_done