git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Junio C Hamano <junkio@cox.net>
To: Linus Torvalds <torvalds@osdl.org>
Cc: git@vger.kernel.org
Subject: [PATCH 1/8] git-apply: work from subdirectory.
Date: Sat, 26 Nov 2005 01:56:32 -0800	[thread overview]
Message-ID: <7viruf68bz.fsf@assigned-by-dhcp.cox.net> (raw)
In-Reply-To: 7vmzjtn3h1.fsf@assigned-by-dhcp.cox.net

This adds three things:

 - prefix_filename() is like prefix_path() but can be used to
   name any file on the filesystem, not the files that might go
   into the index file.

 - git-apply uses setup_git_directory() to find out the GIT_DIR
   and reads configuration file.  Later this would allow us to
   affect the behaviour of the command from the configuration.

 - When git-apply is run from a subdirectory, it applies the
   given patch only to the files under the current directory and
   below.

Signed-off-by: Junio C Hamano <junkio@cox.net>

---

 apply.c |   15 +++++++++++++++
 cache.h |    1 +
 setup.c |   15 +++++++++++++++
 3 files changed, 31 insertions(+), 0 deletions(-)

applies-to: 9ccf8849fa9b522a344645c2f28f12ab036e30d5
c20b8d006edfa964b3df5e4c5cc28cb93edcb240
diff --git a/apply.c b/apply.c
index 50be8f3..ae06d41 100644
--- a/apply.c
+++ b/apply.c
@@ -16,6 +16,9 @@
 //  --numstat does numeric diffstat, and doesn't actually apply
 //  --index-info shows the old and new index info for paths if available.
 //
+static const char *prefix;
+static int prefix_length;
+
 static int allow_binary_replacement = 0;
 static int check_index = 0;
 static int write_index = 0;
@@ -1706,6 +1709,12 @@ static int use_patch(struct patch *p)
 			return 0;
 		x = x->next;
 	}
+	if (prefix && *prefix) {
+		int pathlen = strlen(pathname);
+		if (pathlen <= prefix_length ||
+		    memcmp(prefix, pathname, prefix_length))
+			return 0;
+	}
 	return 1;
 }
 
@@ -1784,6 +1793,10 @@ int main(int argc, char **argv)
 	int i;
 	int read_stdin = 1;
 
+	prefix = setup_git_directory();
+	prefix_length = prefix ? strlen(prefix) : 0;
+	git_config(git_default_config);
+
 	for (i = 1; i < argc; i++) {
 		const char *arg = argv[i];
 		int fd;
@@ -1845,6 +1858,8 @@ int main(int argc, char **argv)
 			line_termination = 0;
 			continue;
 		}
+		arg = prefix_filename(prefix, prefix_length, arg);
+
 		fd = open(arg, O_RDONLY);
 		if (fd < 0)
 			usage(apply_usage);
diff --git a/cache.h b/cache.h
index 6ac94c5..62920ce 100644
--- a/cache.h
+++ b/cache.h
@@ -149,6 +149,7 @@ extern char *get_graft_file(void);
 extern const char **get_pathspec(const char *prefix, const char **pathspec);
 extern const char *setup_git_directory(void);
 extern const char *prefix_path(const char *prefix, int len, const char *path);
+extern const char *prefix_filename(const char *prefix, int len, const char *path);
 
 #define alloc_nr(x) (((x)+16)*3/2)
 
diff --git a/setup.c b/setup.c
index ab3c778..54f6a34 100644
--- a/setup.c
+++ b/setup.c
@@ -47,6 +47,21 @@ const char *prefix_path(const char *pref
 	return path;
 }
 
+/* 
+ * Unlike prefix_path, this should be used if the named file does
+ * not have to interact with index entry; i.e. name of a random file
+ * on the filesystem.
+ */
+const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
+{
+	static char path[PATH_MAX];
+	if (!pfx || !*pfx || arg[0] == '/')
+		return arg;
+	memcpy(path, pfx, pfx_len);
+	strcpy(path + pfx_len, arg);
+	return path;
+}
+
 const char **get_pathspec(const char *prefix, const char **pathspec)
 {
 	const char *entry = *pathspec;
---
0.99.9.GIT

  parent reply	other threads:[~2005-11-26  9:56 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-20 17:00 Get rid of .git/branches/ and .git/remotes/? Johannes Schindelin
2005-11-20 18:09 ` Linus Torvalds
2005-11-20 18:29   ` Sven Verdoolaege
2005-11-20 19:07     ` Linus Torvalds
2005-11-20 19:16       ` Andreas Ericsson
2005-11-20 19:50   ` Johannes Schindelin
2005-11-26 23:50     ` Petr Baudis
2005-11-27  0:38       ` Junio C Hamano
2005-11-20 23:26   ` Josef Weidendorfer
2005-11-20 23:58     ` Johannes Schindelin
2005-11-22 17:31     ` Josef Weidendorfer
2005-11-22 17:56       ` Johannes Schindelin
2005-11-22 19:30         ` Andreas Ericsson
2005-11-23 15:08           ` Johannes Schindelin
2005-11-23 23:21             ` Junio C Hamano
2005-11-23 23:29               ` Andreas Ericsson
2005-11-23 23:42                 ` Johannes Schindelin
2005-11-24  8:05                   ` Andreas Ericsson
2005-11-24  8:33                     ` Junio C Hamano
2005-11-24 10:36                       ` [PATCH] Rename git-config-set to git-repo-config Johannes Schindelin
2005-11-24 11:33                         ` Junio C Hamano
2005-11-24 13:28                           ` Johannes Schindelin
2005-11-24 21:24                             ` Junio C Hamano
2005-11-24 21:54                               ` Johannes Schindelin
2005-11-26  2:22                                 ` Junio C Hamano
2005-11-26  4:05                                   ` Linus Torvalds
2005-11-26  4:07                                     ` Linus Torvalds
2005-11-26  9:51                                     ` [PATCH 0/8] Make C-level operable from subdirectories Junio C Hamano
2005-11-26 10:59                                       ` Junio C Hamano
2005-11-26 18:44                                       ` Ryan Anderson
2005-11-27  9:21                                     ` [PATCH 6/8] ls-tree: work from subdirectory Junio C Hamano
2005-11-27 11:08                                       ` Petr Baudis
2005-11-27 18:01                                       ` Linus Torvalds
2005-11-27 18:22                                         ` Petr Baudis
2005-11-27 19:00                                           ` Linus Torvalds
2005-11-28  1:07                                             ` Junio C Hamano
2005-11-28  1:46                                               ` Linus Torvalds
2005-11-28  6:11                                                 ` Junio C Hamano
2005-11-28  6:48                                                   ` Linus Torvalds
2005-11-28  8:32                                                     ` Junio C Hamano
2005-11-28 10:51                                                       ` Junio C Hamano
2005-11-28 10:51                                                     ` [PATCH] ls-tree: Resurrect funny name quoting lost during rewrite Junio C Hamano
2005-11-26  5:52                               ` [PATCH] Rename git-config-set to git-repo-config Junio C Hamano
2005-11-26  9:56                               ` Junio C Hamano [this message]
2005-11-26 17:36                                 ` [PATCH 1/8] git-apply: work from subdirectory Linus Torvalds
2005-11-26 18:54                                   ` Junio C Hamano
2005-11-27  4:06                                   ` Junio C Hamano
2005-11-27 14:39                                     ` Lars Magne Ingebrigtsen
     [not found]                                       ` <7vy839dfzk.fsf@assigned-by-dhcp.cox.net>
2005-11-27 21:13                                         ` Lars Magne Ingebrigtsen
2005-11-27 22:12                                           ` Junio C Hamano
2005-11-26  9:56                               ` [PATCH 2/8] peek-remote: honor proxy config even " Junio C Hamano
2005-11-26  9:56                               ` [PATCH 3/8] fsck-objects: work " Junio C Hamano
2005-11-26  9:56                               ` [PATCH 4/8] checkout-index: " Junio C Hamano
2005-11-26  9:57                               ` [PATCH 5/8] hash-object: work within subdirectory Junio C Hamano
2005-11-26  9:57                               ` [PATCH 6/8] ls-tree: work from subdirectory Junio C Hamano
2005-11-26 17:38                                 ` Linus Torvalds
2005-11-26  9:57                               ` [PATCH 7/8] Make networking commands to work from a subdirectory Junio C Hamano
2005-11-26  9:57                               ` [PATCH 8/8] Make the rest of commands " Junio C Hamano
2005-11-22 23:05         ` Get rid of .git/branches/ and .git/remotes/? Josef Weidendorfer
2005-11-23 14:53           ` Johannes Schindelin
2005-11-23 15:39             ` Josef Weidendorfer
2005-11-23 17:22               ` Johannes Schindelin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7viruf68bz.fsf@assigned-by-dhcp.cox.net \
    --to=junkio@cox.net \
    --cc=git@vger.kernel.org \
    --cc=torvalds@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).