 113f10f22f
			
		
	
	113f10f22f
	
	
	
		
			
			This replaces git-clean.sh with builtin-clean.c, and moves
git-clean.sh to the examples.
This also introduces a change in behavior when removing directories
explicitly specified as a path.  For example currently:
1. When dir has only untracked files, these two behave differently:
    $ git clean -n dir
    $ git clean -n dir/
the former says "Would not remove dir/", while the latter would say
"Would remove dir/untracked" for all paths under it, but not the
directory itself.
With -d, the former would stop refusing, however since the user
explicitly asked to remove the directory the -d is no longer required.
2. When there are more parameters:
    $ git clean -n dir foo
    $ git clean -n dir/ foo
both cases refuse to remove dir/ unless -d is specified.  Once again
since both cases requested to remove dir the -d is no longer required.
Thanks to Johannes Schindelin for the conversion to using the
parse-options API.
Signed-off-by: Shawn Bohrer <shawn.bohrer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
	
		
			
				
	
	
		
			119 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| #
 | |
| # Copyright (c) 2005-2006 Pavel Roskin
 | |
| #
 | |
| 
 | |
| OPTIONS_KEEPDASHDASH=
 | |
| OPTIONS_SPEC="\
 | |
| git-clean [options] <paths>...
 | |
| 
 | |
| Clean untracked files from the working directory
 | |
| 
 | |
| When optional <paths>... arguments are given, the paths
 | |
| affected are further limited to those that match them.
 | |
| --
 | |
| d remove directories as well
 | |
| f override clean.requireForce and clean anyway
 | |
| n don't remove anything, just show what would be done
 | |
| q be quiet, only report errors
 | |
| x remove ignored files as well
 | |
| X remove only ignored files"
 | |
| 
 | |
| SUBDIRECTORY_OK=Yes
 | |
| . git-sh-setup
 | |
| require_work_tree
 | |
| 
 | |
| ignored=
 | |
| ignoredonly=
 | |
| cleandir=
 | |
| rmf="rm -f --"
 | |
| rmrf="rm -rf --"
 | |
| rm_refuse="echo Not removing"
 | |
| echo1="echo"
 | |
| 
 | |
| disabled=$(git config --bool clean.requireForce)
 | |
| 
 | |
| while test $# != 0
 | |
| do
 | |
| 	case "$1" in
 | |
| 	-d)
 | |
| 		cleandir=1
 | |
| 		;;
 | |
| 	-f)
 | |
| 		disabled=false
 | |
| 		;;
 | |
| 	-n)
 | |
| 		disabled=false
 | |
| 		rmf="echo Would remove"
 | |
| 		rmrf="echo Would remove"
 | |
| 		rm_refuse="echo Would not remove"
 | |
| 		echo1=":"
 | |
| 		;;
 | |
| 	-q)
 | |
| 		echo1=":"
 | |
| 		;;
 | |
| 	-x)
 | |
| 		ignored=1
 | |
| 		;;
 | |
| 	-X)
 | |
| 		ignoredonly=1
 | |
| 		;;
 | |
| 	--)
 | |
| 		shift
 | |
| 		break
 | |
| 		;;
 | |
| 	*)
 | |
| 		usage # should not happen
 | |
| 		;;
 | |
| 	esac
 | |
| 	shift
 | |
| done
 | |
| 
 | |
| # requireForce used to default to false but now it defaults to true.
 | |
| # IOW, lack of explicit "clean.requireForce = false" is taken as
 | |
| # "clean.requireForce = true".
 | |
| case "$disabled" in
 | |
| "")
 | |
| 	die "clean.requireForce not set and -n or -f not given; refusing to clean"
 | |
| 	;;
 | |
| "true")
 | |
| 	die "clean.requireForce set and -n or -f not given; refusing to clean"
 | |
| 	;;
 | |
| esac
 | |
| 
 | |
| if [ "$ignored,$ignoredonly" = "1,1" ]; then
 | |
| 	die "-x and -X cannot be set together"
 | |
| fi
 | |
| 
 | |
| if [ -z "$ignored" ]; then
 | |
| 	excl="--exclude-per-directory=.gitignore"
 | |
| 	excl_info= excludes_file=
 | |
| 	if [ -f "$GIT_DIR/info/exclude" ]; then
 | |
| 		excl_info="--exclude-from=$GIT_DIR/info/exclude"
 | |
| 	fi
 | |
| 	if cfg_excl=$(git config core.excludesfile) && test -f "$cfg_excl"
 | |
| 	then
 | |
| 		excludes_file="--exclude-from=$cfg_excl"
 | |
| 	fi
 | |
| 	if [ "$ignoredonly" ]; then
 | |
| 		excl="$excl --ignored"
 | |
| 	fi
 | |
| fi
 | |
| 
 | |
| git ls-files --others --directory \
 | |
| 	$excl ${excl_info:+"$excl_info"} ${excludes_file:+"$excludes_file"} \
 | |
| 	-- "$@" |
 | |
| while read -r file; do
 | |
| 	if [ -d "$file" -a ! -L "$file" ]; then
 | |
| 		if [ -z "$cleandir" ]; then
 | |
| 			$rm_refuse "$file"
 | |
| 			continue
 | |
| 		fi
 | |
| 		$echo1 "Removing $file"
 | |
| 		$rmrf "$file"
 | |
| 	else
 | |
| 		$echo1 "Removing $file"
 | |
| 		$rmf "$file"
 | |
| 	fi
 | |
| done
 |