Skip to content

Commit

Permalink
git-read-tree --index-output=<file>
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Apr 4, 2007
1 parent 30ca07a commit 5e7f56a
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 16 deletions.
14 changes: 13 additions & 1 deletion Documentation/git-read-tree.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ git-read-tree - Reads tree information into the index

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
Expand Down Expand Up @@ -86,6 +86,18 @@ OPTIONS
file (usually '.gitignore') and allows such an untracked
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#>::
The id of the tree object(s) to be read/merged.

Expand Down
8 changes: 0 additions & 8 deletions Documentation/git.txt
Original file line number Diff line number Diff line change
Expand Up @@ -315,14 +315,6 @@ git so take care if using Cogito etc.
index file. If not specified, the default of `$GIT_DIR/index`
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'::
If the object storage directory is specified via this
environment variable then the sha1 directories are created
Expand Down
7 changes: 6 additions & 1 deletion builtin-read-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -128,6 +128,11 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
continue;
}

if (!prefixcmp(arg, "--index-output=")) {
set_alternate_index_output(arg + 15);
continue;
}

/* "--prefix=<subdirectory>/" means keep the current index
* entries and put the entries from the tree under the
* given subdirectory.
Expand Down
2 changes: 1 addition & 1 deletion cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ enum object_type {
#define DEFAULT_GIT_DIR_ENVIRONMENT ".git"
#define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY"
#define INDEX_ENVIRONMENT "GIT_INDEX_FILE"
#define INDEX_OUTPUT_ENVIRONMENT "_GIT_INDEX_OUTPUT"
#define GRAFT_ENVIRONMENT "GIT_GRAFT_FILE"
#define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR"
#define CONFIG_ENVIRONMENT "GIT_CONFIG"
Expand Down Expand Up @@ -216,6 +215,7 @@ extern int commit_lock_file(struct lock_file *);

extern int hold_locked_index(struct lock_file *, int);
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 int delete_ref(const char *, unsigned char *sha1);
Expand Down
4 changes: 2 additions & 2 deletions git-commit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -370,8 +370,8 @@ t,)
# the same way.
if test -z "$initial_commit"
then
_GIT_INDEX_OUTPUT="$TMP_INDEX" \
GIT_INDEX_FILE="$THIS_INDEX" git-read-tree -i -m HEAD
GIT_INDEX_FILE="$THIS_INDEX" \
git-read-tree --index-output="$TMP_INDEX" -i -m HEAD
else
rm -f "$TMP_INDEX"
fi || exit
Expand Down
11 changes: 8 additions & 3 deletions lockfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "cache.h"

static struct lock_file *lock_file_list;
static const char *alternate_index_output;

static void remove_lock_file(void)
{
Expand Down Expand Up @@ -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);
}

void set_alternate_index_output(const char *name)
{
alternate_index_output = name;
}

int commit_locked_index(struct lock_file *lk)
{
char *output = getenv(INDEX_OUTPUT_ENVIRONMENT);
if (output && *output) {
int result = rename(lk->filename, output);
if (alternate_index_output) {
int result = rename(lk->filename, alternate_index_output);
lk->filename[0] = 0;
return result;
}
Expand Down

0 comments on commit 5e7f56a

Please sign in to comment.