Commit dae556bd authored by Christian Couder's avatar Christian Couder Committed by Junio C Hamano

environment: add global variable to disable replacement

This new "read_replace_refs" global variable is set to 1 by
default, so that replace refs are used by default. But
reachability traversal and packing commands ("cmd_fsck",
"cmd_prune", "cmd_pack_objects", "upload_pack",
"cmd_unpack_objects") set it to 0, as they must work with the
original DAG.
Signed-off-by: Christian Couder's avatarChristian Couder <chriscool@tuxfamily.org>
Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
parent cc400f50
...@@ -589,6 +589,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix) ...@@ -589,6 +589,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
struct alternate_object_database *alt; struct alternate_object_database *alt;
errors_found = 0; errors_found = 0;
read_replace_refs = 0;
argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0); argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0);
if (write_lost_and_found) { if (write_lost_and_found) {
......
...@@ -2103,6 +2103,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) ...@@ -2103,6 +2103,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
int rp_ac_alloc = 64; int rp_ac_alloc = 64;
int rp_ac; int rp_ac;
read_replace_refs = 0;
rp_av = xcalloc(rp_ac_alloc, sizeof(*rp_av)); rp_av = xcalloc(rp_ac_alloc, sizeof(*rp_av));
rp_av[0] = "pack-objects"; rp_av[0] = "pack-objects";
......
...@@ -140,6 +140,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix) ...@@ -140,6 +140,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
char *s; char *s;
save_commit_buffer = 0; save_commit_buffer = 0;
read_replace_refs = 0;
init_revisions(&revs, prefix); init_revisions(&revs, prefix);
argc = parse_options(argc, argv, prefix, options, prune_usage, 0); argc = parse_options(argc, argv, prefix, options, prune_usage, 0);
......
...@@ -495,6 +495,8 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix) ...@@ -495,6 +495,8 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
int i; int i;
unsigned char sha1[20]; unsigned char sha1[20];
read_replace_refs = 0;
git_config(git_default_config, NULL); git_config(git_default_config, NULL);
quiet = !isatty(2); quiet = !isatty(2);
......
...@@ -516,6 +516,7 @@ extern size_t packed_git_window_size; ...@@ -516,6 +516,7 @@ extern size_t packed_git_window_size;
extern size_t packed_git_limit; extern size_t packed_git_limit;
extern size_t delta_base_cache_limit; extern size_t delta_base_cache_limit;
extern int auto_crlf; extern int auto_crlf;
extern int read_replace_refs;
extern int fsync_object_files; extern int fsync_object_files;
extern int core_preload_index; extern int core_preload_index;
......
...@@ -38,6 +38,7 @@ int pager_use_color = 1; ...@@ -38,6 +38,7 @@ int pager_use_color = 1;
const char *editor_program; const char *editor_program;
const char *excludes_file; const char *excludes_file;
int auto_crlf = 0; /* 1: both ways, -1: only when adding git objects */ int auto_crlf = 0; /* 1: both ways, -1: only when adding git objects */
int read_replace_refs = 1;
enum safe_crlf safe_crlf = SAFE_CRLF_WARN; enum safe_crlf safe_crlf = SAFE_CRLF_WARN;
unsigned whitespace_rule_cfg = WS_DEFAULT_RULE; unsigned whitespace_rule_cfg = WS_DEFAULT_RULE;
enum branch_track git_branch_track = BRANCH_TRACK_REMOTE; enum branch_track git_branch_track = BRANCH_TRACK_REMOTE;
......
...@@ -94,6 +94,9 @@ const unsigned char *lookup_replace_object(const unsigned char *sha1) ...@@ -94,6 +94,9 @@ const unsigned char *lookup_replace_object(const unsigned char *sha1)
int pos, depth = MAXREPLACEDEPTH; int pos, depth = MAXREPLACEDEPTH;
const unsigned char *cur = sha1; const unsigned char *cur = sha1;
if (!read_replace_refs)
return sha1;
prepare_replace_object(); prepare_replace_object();
/* Try to recursively replace the object */ /* Try to recursively replace the object */
......
...@@ -82,6 +82,29 @@ test_expect_success 'tag replaced commit' ' ...@@ -82,6 +82,29 @@ test_expect_success 'tag replaced commit' '
git mktag <tag.sig >.git/refs/tags/mytag 2>message git mktag <tag.sig >.git/refs/tags/mytag 2>message
' '
test_expect_success '"git fsck" works' '
git fsck master > fsck_master.out &&
grep "dangling commit $R" fsck_master.out &&
grep "dangling tag $(cat .git/refs/tags/mytag)" fsck_master.out &&
test -z "$(git fsck)"
'
test_expect_success 'repack, clone and fetch work' '
git repack -a -d &&
git clone --no-hardlinks . clone_dir &&
cd clone_dir &&
git show HEAD~5 | grep "A U Thor" &&
git show $HASH2 | grep "A U Thor" &&
git cat-file commit $R &&
git repack -a -d &&
test_must_fail git cat-file commit $R &&
git fetch ../ "refs/replace/*:refs/replace/*" &&
git show HEAD~5 | grep "O Thor" &&
git show $HASH2 | grep "O Thor" &&
git cat-file commit $R &&
cd ..
'
# #
# #
test_done test_done
...@@ -618,6 +618,7 @@ int main(int argc, char **argv) ...@@ -618,6 +618,7 @@ int main(int argc, char **argv)
int strict = 0; int strict = 0;
git_extract_argv0_path(argv[0]); git_extract_argv0_path(argv[0]);
read_replace_refs = 0;
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {
char *arg = argv[i]; char *arg = argv[i];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment