update-index: upgrade/downgrade on-disk index version

With the "--index-version <n>" parameter, write the index out in the
specified version.  With this, an index file that is written in newer
format (say v4) can be downgraded to be read by older versions of Git.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2012-04-04 09:37:02 -07:00
Родитель 9d227781b6
Коммит 69dec66b2f
2 изменённых файлов: 19 добавлений и 1 удалений

Просмотреть файл

@ -19,7 +19,7 @@ SYNOPSIS
[--ignore-submodules] [--ignore-submodules]
[--really-refresh] [--unresolve] [--again | -g] [--really-refresh] [--unresolve] [--again | -g]
[--info-only] [--index-info] [--info-only] [--index-info]
[-z] [--stdin] [-z] [--stdin] [--index-version <n>]
[--verbose] [--verbose]
[--] [<file>...] [--] [<file>...]
@ -143,6 +143,10 @@ you will need to handle the situation manually.
--verbose:: --verbose::
Report what is being added and removed from index. Report what is being added and removed from index.
--index-version <n>::
Write the resulting index out in the named on-disk format version.
The current default version is 2.
-z:: -z::
Only meaningful with `--stdin` or `--index-info`; paths are Only meaningful with `--stdin` or `--index-info`; paths are
separated with NUL character instead of LF. separated with NUL character instead of LF.

Просмотреть файл

@ -708,6 +708,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
int newfd, entries, has_errors = 0, line_termination = '\n'; int newfd, entries, has_errors = 0, line_termination = '\n';
int read_from_stdin = 0; int read_from_stdin = 0;
int prefix_length = prefix ? strlen(prefix) : 0; int prefix_length = prefix ? strlen(prefix) : 0;
int preferred_index_format = 0;
char set_executable_bit = 0; char set_executable_bit = 0;
struct refresh_params refresh_args = {0, &has_errors}; struct refresh_params refresh_args = {0, &has_errors};
int lock_error = 0; int lock_error = 0;
@ -791,6 +792,8 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
"(for porcelains) forget saved unresolved conflicts", "(for porcelains) forget saved unresolved conflicts",
PARSE_OPT_NOARG | PARSE_OPT_NONEG, PARSE_OPT_NOARG | PARSE_OPT_NONEG,
resolve_undo_clear_callback}, resolve_undo_clear_callback},
OPT_INTEGER(0, "index-version", &preferred_index_format,
"write index in this format"),
OPT_END() OPT_END()
}; };
@ -851,6 +854,17 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
} }
} }
argc = parse_options_end(&ctx); argc = parse_options_end(&ctx);
if (preferred_index_format) {
if (preferred_index_format < INDEX_FORMAT_LB ||
INDEX_FORMAT_UB < preferred_index_format)
die("index-version %d not in range: %d..%d",
preferred_index_format,
INDEX_FORMAT_LB, INDEX_FORMAT_UB);
if (the_index.version != preferred_index_format)
active_cache_changed = 1;
the_index.version = preferred_index_format;
}
if (read_from_stdin) { if (read_from_stdin) {
struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT;