On Fri, 2005-08-12 at 03:08 +0200, Petr Baudis wrote:
> Dear diary, on Fri, Aug 12, 2005 at 02:54:13AM CEST, I got a letter
> where Pavel Roskin <[EMAIL PROTECTED]> told me that...
> > Hi, Petr!
> 
> Hi,
> 
> > Unfortunately, my latest revision of cg-clean has "committed suicide"
> > just when I was about to post it.  Anyway, I would prefer to wait until
> > you apply my patch to cg-status to ignore all ignores.  That would allow
> > me to reuse cg-status.
> 
> well, I did quite a while ago. Unless the kernel.org mirroring system
> broke, it should be already public.

Yes, it's there.  Thank you.

This is another attempt at cg-clean.  Verbose mode is now default (i.e.
everything that's removed is reported), "-q" makes the script quiet.
I've reinstated the "hard" option, it's now "-D".

Signed-off-by: Pavel Roskin <[EMAIL PROTECTED]>

#!/usr/bin/env bash
#
# Clean unknown files from the working tree.
# Copyright (c) Pavel Roskin, 2005
#
# Cleans file and directories that are not under version control.
# When run without arguments, files ignored by cg-status and directories
# are not removed.
#
# OPTIONS
# -------
# -d::
#       Also clean directories and their contents.
#
# -D::
#       Same as -d but try harder (change permissions first).
#
# -q::
#       Quiet - don't report what's being cleaned.
#
# -x::
#       Also clean files ignored by cg-status, such as object files.

USAGE="cg-clean [-d] [-D] [-q] [-x]"

. ${COGITO_LIB}cg-Xlib || exit 1

noexclude=
cleandir=
cleandirhard=
quiet=
while optparse; do
        if optparse -d; then
                cleandir=1
        elif optparse -D; then
                cleandir=1
                cleandirhard=1
        elif optparse -q; then
                quiet=1
        elif optparse -x; then
                noexclude=1
        else
                optfail
        fi
done

[ "$ARGS" ] && usage

clean_dirs()
{
        dirlist=$(mktemp -t gitlsfiles.XXXXXX)
        git-ls-files --cached | sed -n 's|^'"$_git_relpath"'||p' |
        sed -n 's|/[^/]*$||p' | sort -u >"$dirlist"

        save_IFS="$IFS"
        IFS=$'\n'

        fpath=${_git_relpath-./}
        find "$fpath" -type d -print | \
        sed 's|^'"$fpath"'||;/^$/d;/^\.git$/d;/^\.git\//d' |
        cat - "$dirlist" | sort -u | diff - "$dirlist" |
        sed -n 's/< //p' |

        for file in $(cat); do
                path="${_git_relpath}$file"
                if [ -z "$cleandir" ]; then
                        echo "Not removing $file/"
                        continue
                fi
                if [ ! -d "$path" ]; then
                        # Perhaps directory was removed with its parent
                        continue
                fi
                [ "$quiet" ] || echo "Removing $file/"
                if [ "$cleandirhard" ]; then
                        chmod -R 700 "$path"
                fi
                rm -rf "$path"
                if [ -e "$path" -o -L "$path" ]; then
                        echo "Cannot remove $file/"
                fi
        done

        IFS="$save_IFS"
        rm -f "$dirlist"
}

clean_files()
{
        xopt=
        if [ "$noexclude" ]; then
                xopt="-x"
        fi

        save_IFS="$IFS"
        IFS=$'\n'

        cg-status "$xopt" -w | sed -n 's/^? //p' |
        for file in $(cat); do
                path="${_git_relpath}$file"
                if [ -d "$path" ]; then
                        # Sanity check, shouldn't happen
                        echo "FATAL: cg-status reports directories" >&2
                        exit 1
                elif [ -e "$path" -o -L "$path" ]; then
                        [ "$quiet" ] || echo "Removing $file"
                        rm -f "$path"
                        if [ -e "$path" -o -L "$path" ]; then
                                echo "Cannot remove $file"
                        fi
                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
        clean_dirs
fi

clean_files



-- 
Regards,
Pavel Roskin

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

Reply via email to