Hello, Petr! Sorry for delay.
On Sun, 2005-07-10 at 17:46 +0200, Petr Baudis wrote: > Dear diary, on Sat, Jul 09, 2005 at 12:34:44AM CEST, I got a letter > where Pavel Roskin <[EMAIL PROTECTED]> told me that... > > Hello, Petr! > > Hello, > > > Please consider this script for Cogito. > > > > Signed-off-by: Pavel Roskin <[EMAIL PROTECTED]> > > the script is definitively interesting, but I have couple of notes > about it first: > > (i) -i sounds wrong for anything but being interactive here ;-) What > about -A? I agree that -i could be confusing, but -A would seem to imply "All", so let it be -x from "exclude". > (ii) I'm confused - if -a is all of the above, how do I clean _only_ > regular files, and only those not ignored by cg-status? cg-clean without options. I'm changing the description to avoid confusion. > (iii) Makes it any sense to remove only special files? I thought it would make sense to have an option to remove them in addition to regular files, but now I think it's not worth the trouble to distinguish between them. > (iv) -r implies being recursive, but it has nothing to do with that > here. Renamed to -d. Other confusing options have been removed. "-a" is retired because it's not hard to type "-dx". Explicit arguments are not accepted - one can easily use "rm" instead. That should make cg-clean much simpler. > (v) Semantically, I think it's quite close to cg-reset. What about > making it part of cg-reset instead of a separate command? I tend to be > careful about command inflation. (That's part of being careful about the > usability in general.) That's just an idea and possibly a bad one, what > do you think? I understand your concern, but cg-reset does other things. cg-reset changes the branch. cg-clean allows to start the build from scratch without changing the branch. It's not uncommon for me to revert patches one-by-one looking for the patch that breaks something. I could make minor changes e.g for debugging or to fix breakage in certain revisions. I would revert such by cg-clean before going to another revision. cg-reset would be an overkill - it would move me to the latest release. I can imagine that cg-reset would call cg-clean (optionally) to allow fresh start on the main branch. The opposite would be wrong. Here's the simplified cg-clean script. Note that the "-d" option is not working with the current version of git of a bug in git-ls-files. I can work it around by scanning all directories in bash, but I think it's easier to fix git (remove "continue" before DT_REG in ls-files.c). Processing of .gitignore was taken from cg-status, and I don't really understand it. But I think it's important to keep that code in sync. It could later go to cg-Xlib. 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. # # -x:: # Also clean files ignored by cg-status, such as object files. USAGE="cg-clean [-d] [-x]" . ${COGITO_LIB}cg-Xlib cleanexclude= cleandir= while optparse; do if optparse -d; then cleandir=1 elif optparse -x; then cleanexclude=1 else optfail fi done # Good candidate for cg-Xlib # Put exclude options for git-ls-files to EXCLUDE set_exclude() { EXCLUDE= stdignores=('*.[ao]' '.*' tags '*~' '#*' ',,merge*') for ign in "[EMAIL PROTECTED]"; do EXCLUDE="$EXCLUDE --exclude=$ign" done EXCLUDEFILE=$_git/exclude if [ -f "$EXCLUDEFILE" ]; then EXCLUDE="$EXCLUDE --exclude-from=$EXCLUDEFILE" fi { path="$_git_relpath" dir= [ -r .gitignore ] && EXCLUDE="$EXCLUDE --exclude-from=.gitignore" while [[ "$path" == */* ]]; do dir="${dir:-.}/${path%%/*}" path="${path#*/}" [ -r $dir/.gitignore ] && EXCLUDE="$EXCLUDE --exclude-from=$dir/.gitignore" done } } if [ -z "$cleanexclude" ]; then set_exclude else EXCLUDE= fi git-update-cache --refresh > /dev/null # Need to use temporary file so that changing IFS doesn't affect $EXCLUDE # expansion. filelist=$(mktemp -t gitlsfiles.XXXXXX) git-ls-files --others $EXCLUDE >"$filelist" save_IFS="$IFS" IFS=$'\n' for file in $(cat "$filelist"); do IFS="$save_IFS" if [ -d "$file" ]; then if [ "$cleandir" ]; then # Try really hard by changing permissions chmod -R 700 "$file" rm -rf "$file" fi return fi rm -f "$file" done rm -f "$filelist" -- 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