{"thread":{"id":"17325","subject":"[PATCH 7/7] environment: add global variable to disable replacement","startedAt":"2009-01-23T09:07:46Z","lastAt":"2009-01-23T09:07:46Z","messageCount":1,"participants":["Christian Couder"],"isPatch":true,"patchVersion":1,"patchTotal":7},"messages":[{"id":"101642","messageId":"20090123100746.51335fa5.chriscool@tuxfamily.org","threadId":"17325","inReplyTo":null,"subject":"[PATCH 7/7] environment: add global variable to disable replacement","fromName":"Christian Couder","fromEmail":"chriscool@tuxfamily.org","sentAt":"2009-01-23T09:07:46Z","receivedAt":"2009-01-23T09:07:46Z","isPatch":true,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"This new \"read_replace_refs\" global variable is set to 1 by\ndefault, so that replace refs are used by default. But\nreachability traversal and packing commands (\"cmd_fsck\",\n\"cmd_prune\", \"cmd_pack_objects\", \"upload_pack\",\n\"cmd_unpack_objects\") set it to 0, as they must work with the\noriginal DAG.\n\nSigned-off-by: Christian Couder <chriscool@tuxfamily.org>\n---\n builtin-fsck.c           |    1 +\n builtin-pack-objects.c   |    2 ++\n builtin-prune.c          |    1 +\n builtin-unpack-objects.c |    2 ++\n cache.h                  |    1 +\n environment.c            |    1 +\n replace_object.c         |    3 +++\n t/t6050-replace.sh       |   23 +++++++++++++++++++++++\n upload-pack.c            |    2 ++\n 9 files changed, 36 insertions(+), 0 deletions(-)\n\n\tNote that I tried a little to test this, but I don't know much\n\tabout packing and reachability traversal commands, so I may be\n\tvery wrong on this patch. There may also be many other\n\tcommands where \"read_replace_refs\" should be set to 0.\n\tPlease check.\n\ndiff --git a/builtin-fsck.c b/builtin-fsck.c\nindex aecc828..67356fb 100644\n--- a/builtin-fsck.c\n+++ b/builtin-fsck.c\n@@ -586,6 +586,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)\n \tint i, heads;\n \n \terrors_found = 0;\n+\tread_replace_refs = 0;\n \n \targc = parse_options(argc, argv, fsck_opts, fsck_usage, 0);\n \tif (write_lost_and_found) {\ndiff --git a/builtin-pack-objects.c b/builtin-pack-objects.c\nindex e851534..8e161a3 100644\n--- a/builtin-pack-objects.c\n+++ b/builtin-pack-objects.c\n@@ -2080,6 +2080,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)\n \tint rp_ac_alloc = 64;\n \tint rp_ac;\n \n+\tread_replace_refs = 0;\n+\n \trp_av = xcalloc(rp_ac_alloc, sizeof(*rp_av));\n \n \trp_av[0] = \"pack-objects\";\ndiff --git a/builtin-prune.c b/builtin-prune.c\nindex 545e9c1..c0a26fe 100644\n--- a/builtin-prune.c\n+++ b/builtin-prune.c\n@@ -140,6 +140,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix)\n \tchar *s;\n \n \tsave_commit_buffer = 0;\n+\tread_replace_refs = 0;\n \tinit_revisions(&revs, prefix);\n \n \targc = parse_options(argc, argv, options, prune_usage, 0);\ndiff --git a/builtin-unpack-objects.c b/builtin-unpack-objects.c\nindex 47ed610..1a4d51b 100644\n--- a/builtin-unpack-objects.c\n+++ b/builtin-unpack-objects.c\n@@ -495,6 +495,8 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)\n \tint i;\n \tunsigned char sha1[20];\n \n+\tread_replace_refs = 0;\n+\n \tgit_config(git_default_config, NULL);\n \n \tquiet = !isatty(2);\ndiff --git a/cache.h b/cache.h\nindex 1b34381..48fa12a 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -510,6 +510,7 @@ extern size_t packed_git_window_size;\n extern size_t packed_git_limit;\n extern size_t delta_base_cache_limit;\n extern int auto_crlf;\n+extern int read_replace_refs;\n extern int fsync_object_files;\n extern int core_preload_index;\n \ndiff --git a/environment.c b/environment.c\nindex e278bce..d11dde1 100644\n--- a/environment.c\n+++ b/environment.c\n@@ -38,6 +38,7 @@ int pager_use_color = 1;\n const char *editor_program;\n const char *excludes_file;\n int auto_crlf = 0;\t/* 1: both ways, -1: only when adding git objects */\n+int read_replace_refs = 1;\n enum safe_crlf safe_crlf = SAFE_CRLF_WARN;\n unsigned whitespace_rule_cfg = WS_DEFAULT_RULE;\n enum branch_track git_branch_track = BRANCH_TRACK_REMOTE;\ndiff --git a/replace_object.c b/replace_object.c\nindex 5b973ba..1227214 100644\n--- a/replace_object.c\n+++ b/replace_object.c\n@@ -100,6 +100,9 @@ const unsigned char *lookup_replace_object(const unsigned char *sha1)\n \tint pos, depth = MAXREPLACEDEPTH;\n \tconst unsigned char *cur = sha1;\n \n+\tif (!read_replace_refs)\n+\t\treturn sha1;\n+\n \tprepare_replace_object();\n \n \t/* Try to recursively replace the object */\ndiff --git a/t/t6050-replace.sh b/t/t6050-replace.sh\nindex 334aed6..17f6063 100755\n--- a/t/t6050-replace.sh\n+++ b/t/t6050-replace.sh\n@@ -82,6 +82,29 @@ test_expect_success 'tag replaced commit' '\n      git mktag <tag.sig >.git/refs/tags/mytag 2>message\n '\n \n+test_expect_success '\"git fsck\" works' '\n+     git fsck master > fsck_master.out &&\n+     grep \"dangling commit $R\" fsck_master.out &&\n+     grep \"dangling tag $(cat .git/refs/tags/mytag)\" fsck_master.out &&\n+     test -z \"$(git fsck)\"\n+'\n+\n+test_expect_success 'repack, clone and fetch work' '\n+     git repack -a -d &&\n+     git clone --no-hardlinks . clone_dir &&\n+     cd clone_dir &&\n+     git show HEAD~5 | grep \"A U Thor\" &&\n+     git show $HASH2 | grep \"A U Thor\" &&\n+     git cat-file commit $R &&\n+     git repack -a -d &&\n+     test_must_fail git cat-file commit $R &&\n+     git fetch ../ \"refs/replace/*:refs/replace/*\" &&\n+     git show HEAD~5 | grep \"O Thor\" &&\n+     git show $HASH2 | grep \"O Thor\" &&\n+     git cat-file commit $R &&\n+     cd ..\n+'\n+\n #\n #\n test_done\ndiff --git a/upload-pack.c b/upload-pack.c\nindex e5adbc0..186e338 100644\n--- a/upload-pack.c\n+++ b/upload-pack.c\n@@ -616,6 +616,8 @@ int main(int argc, char **argv)\n \tint i;\n \tint strict = 0;\n \n+\tread_replace_refs = 0;\n+\n \tfor (i = 1; i < argc; i++) {\n \t\tchar *arg = argv[i];\n \n-- \n1.6.1.231.g9c286\n"}]}