[PATCH 2/2] git-read-tree --index-output=<file>

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

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

Signed-off-by: Junio C Hamano <junkio@xxxxxxx>
---
 Documentation/git-read-tree.txt |   14 +++++++++++++-
 Documentation/git.txt           |    9 ---------
 builtin-read-tree.c             |    7 ++++++-
 cache.h                         |    2 +-
 git-commit.sh                   |    4 ++--
 lockfile.c                      |   11 ++++++++---
 6 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/Documentation/git-read-tree.txt b/Documentation/git-read-tree.txt
index 0ff2890..69f2223 100644
--- a/Documentation/git-read-tree.txt
+++ b/Documentation/git-read-tree.txt
@@ -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
@@ -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`,
+	place the resulting index to the named file.  While the
+	command is operating, the original index file is locked
+	with the same mechanism as usual.  The file must be
+	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 in the same filesystem as the index
+	file itself, and you need write permission to the
+	directory the index file and index output file is
+	located in.
+
 <tree-ish#>::
 	The id of the tree object(s) to be read/merged.
 
diff --git a/Documentation/git.txt b/Documentation/git.txt
index bc025d6..dceacfa 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -311,15 +311,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 the usual
-	`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.  Do not use it.
-
 'GIT_OBJECT_DIRECTORY'::
 	If the object storage directory is specified via this
 	environment variable then the sha1 directories are created
diff --git a/builtin-read-tree.c b/builtin-read-tree.c
index 87048f8..213bd93 100644
--- a/builtin-read-tree.c
+++ b/builtin-read-tree.c
@@ -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;
 
@@ -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.
diff --git a/cache.h b/cache.h
index 59a05c1..592331f 100644
--- a/cache.h
+++ b/cache.h
@@ -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"
@@ -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);
diff --git a/git-commit.sh b/git-commit.sh
index 20c0dc8..9e0959a 100755
--- a/git-commit.sh
+++ b/git-commit.sh
@@ -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
diff --git a/lockfile.c b/lockfile.c
index 2023ebb..bed6b21 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -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)
 {
@@ -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;
 	}
-- 
1.5.1.rc3.26.g4f01


-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]