All of lore.kernel.org
 help / color / mirror / Atom feed
From: Clemens Buchacher <drizzd@aon.at>
To: Junio C Hamano <gitster@pobox.com>
Cc: Joshua Jensen <jjensen@workspacewhiz.com>,
	"git@vger.kernel.org" <git@vger.kernel.org>
Subject: Re: [PATCH] optionally disable overwriting of ignored files
Date: Sat, 21 Aug 2010 15:23:56 +0200	[thread overview]
Message-ID: <20100821132356.GA31998@localhost> (raw)
In-Reply-To: <7v4oepaup7.fsf@alter.siamese.dyndns.org>

[-- Attachment #1: Type: text/plain, Size: 4410 bytes --]

On Fri, Aug 20, 2010 at 01:35:32PM -0700, Junio C Hamano wrote:
>
>     $ echo foo >po
>     $ git checkout pu
> 
> should error out, as "po" is a directory that has tracked contents, and we
> never said the untracked regular file "po" is trashable, but the above
> sequence happily checks the branch out.

Looks like this case is simply overlooked in verify_absent_1(). The
following takes the existing lstat_cache() code and deals with the
FL_ERR case, which is when there is a file in the way of the
leading path.

The patch below fixes the issue and passes the test suite, but it's
lacking in various ways and I am probably breaking something in
lstat_cache(), which I do not completely understand yet.

So it's going to take some more work to fix this properly.

Clemens

 cache.h        |    1 +
 symlinks.c     |   20 ++++++++++++++++++--
 unpack-trees.c |   25 ++++++++++++++++++++++++-
 3 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/cache.h b/cache.h
index dd1b8f7..5a8a99d 100644
--- a/cache.h
+++ b/cache.h
@@ -850,6 +850,7 @@ struct cache_def {
 extern int has_symlink_leading_path(const char *name, int len);
 extern int threaded_has_symlink_leading_path(struct cache_def *, const char *, int);
 extern int has_symlink_or_noent_leading_path(const char *name, int len);
+extern int find_leading_path(const char *name, int len, const char **path, int *path_len);
 extern int has_dirs_only_path(const char *name, int len, int prefix_len);
 extern void schedule_dir_for_removal(const char *name, int len);
 extern void remove_scheduled_dirs(void);
diff --git a/symlinks.c b/symlinks.c
index 8860120..3f78168 100644
--- a/symlinks.c
+++ b/symlinks.c
@@ -152,7 +152,7 @@ static int lstat_cache(struct cache_def *cache, const char *name, int len,
 	 * path types, FL_NOENT, FL_SYMLINK and FL_DIR, can be cached
 	 * for the moment!
 	 */
-	save_flags = ret_flags & track_flags & (FL_NOENT|FL_SYMLINK);
+	save_flags = ret_flags & track_flags & (FL_NOENT|FL_SYMLINK|FL_ERR);
 	if (save_flags && last_slash > 0 && last_slash <= PATH_MAX) {
 		cache->path[last_slash] = '\0';
 		cache->len = last_slash;
@@ -199,7 +199,7 @@ int has_symlink_leading_path(const char *name, int len)
 
 /*
  * Return non-zero if path 'name' has a leading symlink component or
- * if some leading path component does not exists.
+ * if some leading path component does not exist.
  */
 int has_symlink_or_noent_leading_path(const char *name, int len)
 {
@@ -210,6 +210,22 @@ int has_symlink_or_noent_leading_path(const char *name, int len)
 }
 
 /*
+ * Stat for leading path.
+ */
+int find_leading_path(const char *name, int len, const char **path, int *path_len)
+{
+	struct cache_def *cache = &default_cache;	/* FIXME */
+	int flags = lstat_cache(cache, name, len,
+			   FL_SYMLINK|FL_NOENT|FL_DIR|FL_ERR, USE_ONLY_LSTAT);
+	*path = cache->path;
+	*path_len = cache->len;
+	if (flags & FL_ERR)
+		return -1;
+	else
+		return flags & (FL_SYMLINK|FL_NOENT);
+}
+
+/*
  * Return non-zero if all path components of 'name' exists as a
  * directory.  If prefix_len > 0, we will test with the stat()
  * function instead of the lstat() function for a prefix length of
diff --git a/unpack-trees.c b/unpack-trees.c
index 8cf0da3..250ed7c 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -1016,12 +1016,35 @@ static int verify_absent_1(struct cache_entry *ce, const char *action,
 				 const char *error_msg)
 {
 	struct stat st;
+	const char *path;
+	int path_len;
+	int ret;
 
 	if (o->index_only || o->reset || !o->update)
 		return 0;
 
-	if (has_symlink_or_noent_leading_path(ce->name, ce_namelen(ce)))
+	ret = find_leading_path(ce->name, ce_namelen(ce), &path, &path_len);
+	if (ret > 0)
 		return 0;
+	else if (ret < 0) {
+		struct cache_entry *result;
+
+		/* FIXME: respect ignores etc. as below */
+
+		/*
+		 * The previous round may already have decided to
+		 * delete this path, which is in a subdirectory that
+		 * is being replaced with a blob.
+		 */
+		result = index_name_exists(&o->result, path, path_len, 0);
+		if (result) {
+			if (result->ce_flags & CE_REMOVE)
+				return 0;
+		}
+
+		return o->gently ? -1 :
+			error(ERRORMSG(o, would_lose_untracked), path, action);
+	}
 
 	if (!lstat(ce->name, &st)) {
 		int dtype = ce_to_dtype(ce);
-- 
1.7.2.1.1.g202c


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 490 bytes --]

  parent reply	other threads:[~2010-08-21 13:24 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-15 13:01 Ignored files being silently overwritten when switching branches Per Lundberg
2018-10-16  6:40 ` Jeff King
2018-10-16  9:10   ` Ævar Arnfjörð Bjarmason
2010-08-17  5:21     ` git merge, .gitignore, and silently overwriting untracked files Joshua Jensen
2010-08-17 19:33       ` Junio C Hamano
2010-08-18 23:39         ` [PATCH] optionally disable overwriting of ignored files Clemens Buchacher
2010-08-19 10:41           ` Jakub Narebski
2010-08-20 18:48             ` Clemens Buchacher
2010-08-20 19:01               ` Joshua Jensen
2010-08-20 20:35           ` Junio C Hamano
2010-08-21  8:05             ` Clemens Buchacher
2010-08-22  7:25               ` Junio C Hamano
2010-08-22  8:20                 ` Clemens Buchacher
2010-10-09 22:39               ` Kevin Ballard
2010-08-21 13:23             ` Clemens Buchacher [this message]
2010-10-09 13:52             ` [PATCH 0/5] do not overwrite untracked files in leading path Clemens Buchacher
2010-10-09 13:52             ` [PATCH 1/5] t7607: use test_commit and test_must_fail Clemens Buchacher
2010-10-10  6:35               ` Jonathan Nieder
2010-10-10  8:35                 ` [PATCH 1/5 v2] t7607: use test-lib functions and check MERGE_HEAD Clemens Buchacher
2010-10-13 21:33                   ` Junio C Hamano
2010-10-13 21:59                   ` Junio C Hamano
2010-10-09 13:52             ` [PATCH 2/5] t7607: add leading-path tests Clemens Buchacher
2010-10-09 19:14               ` Johannes Sixt
2010-10-10  8:38                 ` [PATCH 2/5 v2] " Clemens Buchacher
2010-10-09 13:52             ` [PATCH 3/5] add function check_ok_to_remove() Clemens Buchacher
2010-10-13 21:43               ` Junio C Hamano
2010-10-09 13:52             ` [PATCH 4/5] lstat_cache: optionally return match_len Clemens Buchacher
2010-10-09 13:53             ` [PATCH 5/5] do not overwrite files in leading path Clemens Buchacher
2010-10-13 21:57               ` Junio C Hamano
2010-10-13 22:34                 ` Clemens Buchacher
2010-10-15  6:48                   ` Clemens Buchacher
2010-10-15 18:47                     ` Junio C Hamano
2010-08-20 20:46           ` [PATCH] optionally disable overwriting of ignored files Junio C Hamano
2010-08-21  6:48             ` [PATCH v2] " Clemens Buchacher
2010-08-23  8:33           ` [PATCH] " Matthieu Moy
2010-08-31 18:44             ` Heiko Voigt
2010-08-23  9:37           ` Matthieu Moy
2010-08-23 13:56             ` Holger Hellmuth
2010-08-23 15:11               ` Clemens Buchacher
2010-08-23 15:57                 ` Junio C Hamano
2010-08-24  7:28                   ` Clemens Buchacher
2010-08-24 16:19                     ` Junio C Hamano
2018-11-06 12:41       ` Checkout deleted semi-untracked file Steffen Jost
2018-11-06 15:12         ` Ævar Arnfjörð Bjarmason
2018-11-11  9:52           ` [RFC PATCH] Introduce "precious" file concept Nguyễn Thái Ngọc Duy
2018-11-11 12:15             ` Bert Wesarg
2018-11-11 12:33             ` Ævar Arnfjörð Bjarmason
2018-11-11 13:06               ` Ævar Arnfjörð Bjarmason
2018-11-12 16:14                 ` Duy Nguyen
2018-11-11 15:41               ` Duy Nguyen
2018-11-11 16:55                 ` Ævar Arnfjörð Bjarmason
2018-11-12  7:35                 ` Per Lundberg
2018-11-12  9:08                   ` Matthieu Moy
2018-11-12  9:49                     ` Ævar Arnfjörð Bjarmason
2018-11-12 10:26                       ` Junio C Hamano
2018-11-12 12:45                         ` Ævar Arnfjörð Bjarmason
2018-11-12 13:02                           ` Junio C Hamano
2018-11-12 16:07                     ` Duy Nguyen
2018-11-12 23:22               ` brian m. carlson
2018-11-26  9:30                 ` Per Lundberg
2018-11-26 10:28                   ` Ævar Arnfjörð Bjarmason
2018-11-26 12:49                   ` Junio C Hamano
2018-11-27 15:08                     ` Ævar Arnfjörð Bjarmason
2018-11-28  3:58                       ` Junio C Hamano
2018-11-28 21:54                         ` Ævar Arnfjörð Bjarmason
2018-11-29  5:04                           ` Junio C Hamano
2018-12-01  6:21                           ` Duy Nguyen
2018-11-26 15:26                   ` Duy Nguyen
2018-11-26 15:34                     ` Ævar Arnfjörð Bjarmason
2018-11-26 15:40                       ` Duy Nguyen
2018-11-26 15:47                         ` Ævar Arnfjörð Bjarmason
2018-11-26 15:55                           ` Duy Nguyen
2018-11-27  9:43                             ` Per Lundberg
2018-11-27 12:55                               ` Jacob Keller
2018-11-27 14:50                                 ` Per Lundberg
2018-11-28  1:21                                   ` brian m. carlson
2018-11-28  6:54                                     ` Per Lundberg
2018-11-27 15:19                                 ` Duy Nguyen
2018-12-06 18:39                                 ` Duy Nguyen
2018-11-26 16:02                 ` Eckhard Maaß
2018-11-11 12:59             ` Junio C Hamano
2018-11-26 19:38             ` [PATCH v2 0/2] Precios files round two Nguyễn Thái Ngọc Duy
2018-11-26 19:38               ` [PATCH v2 1/2] Introduce "precious" file concept Nguyễn Thái Ngọc Duy
2018-11-26 19:38               ` [PATCH v2 2/2] unpack-trees: support core.allIgnoredFilesArePreciousWhenMerging Nguyễn Thái Ngọc Duy
2018-10-16 15:05     ` Ignored files being silently overwritten when switching branches Duy Nguyen
2018-10-18  1:55       ` Junio C Hamano

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=20100821132356.GA31998@localhost \
    --to=drizzd@aon.at \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jjensen@workspacewhiz.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.