* [PATCH 1/2] cg-clean shouldn't clean untracked directories without -d
@ 2006-02-14 18:05 Pavel Roskin
2006-02-14 18:05 ` [PATCH 2/2] Workaround git < 1.2.0 ignoring .gitignore in parent directories Pavel Roskin
0 siblings, 1 reply; 2+ messages in thread
From: Pavel Roskin @ 2006-02-14 18:05 UTC (permalink / raw)
To: Petr Baudis; +Cc: git
Use the new squashdirs argument in list_untracked_files() to treat
untracked directories and their contents as a whole. Remove a separate
pass to find untracked directories. Adjust the testsuite accordingly.
Don't change IFS - it's no longer needed.
Signed-off-by: Pavel Roskin <proski@gnu.org>
---
cg-clean | 99 ++++++++++--------------------------------------------
t/t9400-clean.sh | 3 +-
2 files changed, 20 insertions(+), 82 deletions(-)
diff --git a/cg-clean b/cg-clean
index b40b41b..5c27a26 100755
--- a/cg-clean
+++ b/cg-clean
@@ -53,88 +53,27 @@ done
[ ${#ARGS[*]} = 0 ] || usage
-
-clean_dirs()
-{
- dirlist="$(mktemp -t gitlsfiles.XXXXXX)"
- git-ls-files --cached |
- sed -n 's|/[^/]*$||p' |
- while IFS=$'\n' read -r dir; do
- while true; do
- echo "$dir"
- updir="${dir%/*}"
- [ "$dir" = "$updir" ] && break
- dir="$updir"
- done
- done |
- sort -u >"$dirlist"
-
- save_IFS="$IFS"
- IFS=$'\n'
-
- find ./ -type d -print |
- sed 's/^\.\///;/^$/d;/^\.git$/d;/^\.git\//d' |
- cat - "$dirlist" | sort -u |
- diff - "$dirlist" |
- sed -n 's/< //p' |
- while read -r dir; do
- if [ ! -d "$dir" ]; then
- # Perhaps directory was removed with its parent
- continue
- fi
+cd "${_git_relpath-.}"
+list_untracked_files "$noexclude" squashdirs | tr '\0' '\n' |
+while read -r file; do
+ if [ -d "$file" -a ! -L "$file" ]; then
if [ -z "$cleandir" ]; then
- echo "Not removing $dir/"
+ echo "Not removing $file"
continue
fi
- [ "$quiet" ] || echo "Removing $dir/"
+ [ "$quiet" ] || echo "Removing $file"
if [ "$cleandirhard" ]; then
- chmod -R 700 "$dir"
+ chmod -R 700 "$file"
fi
- $rm -rf "$dir"
- if [ -e "$dir" -o -L "$dir" ]; then
- echo "Cannot remove $dir/"
- fi
- done
-
- IFS="$save_IFS"
- rm "$dirlist"
-}
-
-clean_files()
-{
- save_IFS="$IFS"
- IFS=$'\n'
-
- list_untracked_files "$noexclude" nosquashdirs | tr '\0' '\n' |
- (cd "${_git_relpath-.}" &&
- while read -r file; do
- if [ -z "$_git_relpath" ] || [ x"${file#$_git_relpath}" != x"$file" ]; then
- file="${file#$_git_relpath}"
- else
- continue
- fi
-
- if [ -d "$file" -a ! -L "$file" ]; then
- # Sanity check, shouldn't happen
- echo "FATAL: cg-status reports directories (internal error)" >&2
- exit 1
- elif [ -e "$file" -o -L "$file" ]; then
- [ "$quiet" ] || echo "Removing $file"
- "$rm" -f "$file"
- # rm would complain itself on failure
- else
- echo "File $file has disappeared!"
- fi
- done)
-
- IFS="$save_IFS"
-}
-
-
-# Even if -d or -D is not specified, we want to tell user about
-# directories that are not removed
-if [ -z "$quiet" -o "$cleandir" ]; then
- ( cd "${_git_relpath-.}" && clean_dirs )
-fi
-
-clean_files
+ $rm -rf "$file"
+ if [ -e "$file" -o -L "$file" ]; then
+ echo "Cannot remove $file"
+ fi
+ elif [ -e "$file" -o -L "$file" ]; then
+ [ "$quiet" ] || echo "Removing $file"
+ "$rm" -f "$file"
+ # rm would complain itself on failure
+ else
+ echo "File $file has disappeared!"
+ fi
+done
diff --git a/t/t9400-clean.sh b/t/t9400-clean.sh
index 47ae0dc..98801c5 100755
--- a/t/t9400-clean.sh
+++ b/t/t9400-clean.sh
@@ -84,10 +84,8 @@ echo "ign file 3" >"repo dir/ign file 3.
echo "ign file 4" >"repo dir/ign file 4.ign1"
mklist init
-# FIXME: cg-clean shouldn't clean unknown directories without "-d"
loss='extra file 1
ign file 2.ign1
-extra dir 1/extra file 3
repo dir/extra file 2'
test_expect_success 'cg-clean in top-level dir' \
"(cg-clean && check_loss)"
@@ -99,6 +97,7 @@ test_expect_success 'cg-clean -x in top-
"(cg-clean -x && check_loss)"
loss='extra dir 1
+extra dir 1/extra file 3
repo dir/extra dir 2'
test_expect_success 'cg-clean -d in top-level dir' \
"(cg-clean -d && check_loss)"
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH 2/2] Workaround git < 1.2.0 ignoring .gitignore in parent directories
2006-02-14 18:05 [PATCH 1/2] cg-clean shouldn't clean untracked directories without -d Pavel Roskin
@ 2006-02-14 18:05 ` Pavel Roskin
0 siblings, 0 replies; 2+ messages in thread
From: Pavel Roskin @ 2006-02-14 18:05 UTC (permalink / raw)
To: Petr Baudis; +Cc: git
Add --exclude-from for all existing .gitignore files in parent
directories up to the repository root. This is not needed for git 1.2.0
and newer.
Signed-off-by: Pavel Roskin <proski@gnu.org>
---
cg-Xlib | 16 ++++++++++++++++
1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/cg-Xlib b/cg-Xlib
index 85a21c2..af278b6 100644
--- a/cg-Xlib
+++ b/cg-Xlib
@@ -230,6 +230,22 @@ list_untracked_files()
EXCLUDE[${#EXCLUDE[@]}]="--exclude-from=$EXCLUDEFILE"
fi
EXCLUDE[${#EXCLUDE[@]}]="--exclude-per-directory=.gitignore"
+ # Workaround for git < 1.2.0
+ if [ -n "$_git_relpath" ]; then
+ local dir="${_git_relpath%/}"
+ local reldir=".."
+ while [ "$dir" != "." ]; do
+ if [ "${dir%/*}" = "$dir" ]; then
+ dir="."
+ else
+ dir="${dir%/*}"
+ fi
+ if [ -f "$reldir/.gitignore" ]; then
+ EXCLUDE[${#EXCLUDE[@]}]="--exclude-from=$dir/.gitignore"
+ fi
+ reldir="../$reldir"
+ done
+ fi
fi
local listdirs=
[ "$squashflag" = "squashdirs" ] && listdirs=--directory
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2006-02-14 18:06 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-02-14 18:05 [PATCH 1/2] cg-clean shouldn't clean untracked directories without -d Pavel Roskin
2006-02-14 18:05 ` [PATCH 2/2] Workaround git < 1.2.0 ignoring .gitignore in parent directories Pavel Roskin
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).