git-read-tree --index-output=<file>

This corrects the interface mistake of the previous one, and
gives a command line parameter to the only plumbing command that
currently needs it: "git-read-tree".

We can add the calls to set_alternate_index_output() to other
plumbing commands that update the index if/when needed.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2007-03-31 23:27:41 -07:00
parent 30ca07a249
commit 5e7f56ac33
6 changed files with 30 additions and 16 deletions

View File

@ -8,7 +8,7 @@ git-read-tree - Reads tree information into the index
SYNOPSIS SYNOPSIS
-------- --------
'git-read-tree' (<tree-ish> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] <tree-ish1> [<tree-ish2> [<tree-ish3>]]) 'git-read-tree' (<tree-ish> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] [--index-output=<file>] <tree-ish1> [<tree-ish2> [<tree-ish3>]])
DESCRIPTION DESCRIPTION
@ -86,6 +86,18 @@ OPTIONS
file (usually '.gitignore') and allows such an untracked file (usually '.gitignore') and allows such an untracked
but explicitly ignored file to be overwritten. but explicitly ignored file to be overwritten.
--index-output=<file>::
Instead of writing the results out to `$GIT_INDEX_FILE`,
write the resulting index in the named file. While the
command is operating, the original index file is locked
with the same mechanism as usual. The file must allow
to be rename(2)ed into from a temporary file that is
created next to the usual index file; typically this
means it needs to be on the same filesystem as the index
file itself, and you need write permission to the
directories the index file and index output file are
located in.
<tree-ish#>:: <tree-ish#>::
The id of the tree object(s) to be read/merged. The id of the tree object(s) to be read/merged.

View File

@ -315,14 +315,6 @@ git so take care if using Cogito etc.
index file. If not specified, the default of `$GIT_DIR/index` index file. If not specified, the default of `$GIT_DIR/index`
is used. is used.
'_GIT_INDEX_OUTPUT'::
When this environment is defined, plumbing level
commands that update the index writes the resulting
index to this file, instead of `$GIT_INDEX_FILE` (or its
default `$GIT_DIR/index`). This is solely meant to be
used by Porcelain to drive low-level plumbing. Defining
this in user's environment is always an error.
'GIT_OBJECT_DIRECTORY':: 'GIT_OBJECT_DIRECTORY'::
If the object storage directory is specified via this If the object storage directory is specified via this
environment variable then the sha1 directories are created environment variable then the sha1 directories are created

View File

@ -84,7 +84,7 @@ static void prime_cache_tree(void)
} }
static const char read_tree_usage[] = "git-read-tree (<sha> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] <sha1> [<sha2> [<sha3>]])"; static const char read_tree_usage[] = "git-read-tree (<sha> | [[-m [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] [--index-output=<file>] <sha1> [<sha2> [<sha3>]])";
static struct lock_file lock_file; static struct lock_file lock_file;
@ -128,6 +128,11 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
continue; continue;
} }
if (!prefixcmp(arg, "--index-output=")) {
set_alternate_index_output(arg + 15);
continue;
}
/* "--prefix=<subdirectory>/" means keep the current index /* "--prefix=<subdirectory>/" means keep the current index
* entries and put the entries from the tree under the * entries and put the entries from the tree under the
* given subdirectory. * given subdirectory.

View File

@ -147,7 +147,6 @@ enum object_type {
#define DEFAULT_GIT_DIR_ENVIRONMENT ".git" #define DEFAULT_GIT_DIR_ENVIRONMENT ".git"
#define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY" #define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY"
#define INDEX_ENVIRONMENT "GIT_INDEX_FILE" #define INDEX_ENVIRONMENT "GIT_INDEX_FILE"
#define INDEX_OUTPUT_ENVIRONMENT "_GIT_INDEX_OUTPUT"
#define GRAFT_ENVIRONMENT "GIT_GRAFT_FILE" #define GRAFT_ENVIRONMENT "GIT_GRAFT_FILE"
#define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR" #define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR"
#define CONFIG_ENVIRONMENT "GIT_CONFIG" #define CONFIG_ENVIRONMENT "GIT_CONFIG"
@ -216,6 +215,7 @@ extern int commit_lock_file(struct lock_file *);
extern int hold_locked_index(struct lock_file *, int); extern int hold_locked_index(struct lock_file *, int);
extern int commit_locked_index(struct lock_file *); extern int commit_locked_index(struct lock_file *);
extern void set_alternate_index_output(const char *);
extern void rollback_lock_file(struct lock_file *); extern void rollback_lock_file(struct lock_file *);
extern int delete_ref(const char *, unsigned char *sha1); extern int delete_ref(const char *, unsigned char *sha1);

View File

@ -370,8 +370,8 @@ t,)
# the same way. # the same way.
if test -z "$initial_commit" if test -z "$initial_commit"
then then
_GIT_INDEX_OUTPUT="$TMP_INDEX" \ GIT_INDEX_FILE="$THIS_INDEX" \
GIT_INDEX_FILE="$THIS_INDEX" git-read-tree -i -m HEAD git-read-tree --index-output="$TMP_INDEX" -i -m HEAD
else else
rm -f "$TMP_INDEX" rm -f "$TMP_INDEX"
fi || exit fi || exit

View File

@ -4,6 +4,7 @@
#include "cache.h" #include "cache.h"
static struct lock_file *lock_file_list; static struct lock_file *lock_file_list;
static const char *alternate_index_output;
static void remove_lock_file(void) static void remove_lock_file(void)
{ {
@ -70,11 +71,15 @@ int hold_locked_index(struct lock_file *lk, int die_on_error)
return hold_lock_file_for_update(lk, get_index_file(), die_on_error); return hold_lock_file_for_update(lk, get_index_file(), die_on_error);
} }
void set_alternate_index_output(const char *name)
{
alternate_index_output = name;
}
int commit_locked_index(struct lock_file *lk) int commit_locked_index(struct lock_file *lk)
{ {
char *output = getenv(INDEX_OUTPUT_ENVIRONMENT); if (alternate_index_output) {
if (output && *output) { int result = rename(lk->filename, alternate_index_output);
int result = rename(lk->filename, output);
lk->filename[0] = 0; lk->filename[0] = 0;
return result; return result;
} }