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 --]
next prev parent reply other threads:[~2010-08-21 13:24 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
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-10-16 9:10 ` Ignored files being silently overwritten when switching branches Ævar Arnfjörð Bjarmason
2018-10-16 15:05 ` Duy Nguyen
2018-10-18 1:55 ` Junio C Hamano
2018-11-06 15:12 ` Checkout deleted semi-untracked file Æ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: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-11-11 12:33 ` [RFC PATCH] Introduce "precious" file concept Æ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ß
-- strict thread matches above, loose matches on Subject: below --
2018-10-15 13:01 Ignored files being silently overwritten when switching branches Per Lundberg
2018-10-16 6:40 ` Jeff King
2018-11-06 12:41 Checkout deleted semi-untracked file Steffen Jost
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
List information: http://vger.kernel.org/majordomo-info.html
* 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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).