Re: New script: cg-clean
Hi, Petr! 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. On Fri, 2005-08-12 at 01:29 +0200, Petr Baudis wrote: 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). Is that fixed already? It turn out it's quite tricky. git-ls-files doesn't distinguish between known and unknown directories. One way to do it would be to check all cached files and find all directories they are in. Another approach would involve git-ls-tree -r, but I don't think it would be right because we work with cache and current files, not with committed data (but my knowledge is limited to make a call - I still need to read the documentation about git). What I did was following: git-ls-files --cached is run, directories are extracted, sorted but sort -u and put to a temporary file dirlist1. find -type d is run, .git is filtered out, the list is merged with dirlist1, sorted by sort -u, and put to dirlist2. dirlist1 and dirlist2 are compared by diff, the entries in dirlist2 are unknown directories. (That's the kind of task where Perl hashes would be great). A technical detail - both lists are limited to $_git_relpath if it's defined. 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. It became much simpler a short while later, thankfully. Judging from your another patch, I suppose you are going to update this script accordingly? Yes, I'm going to use cg-status -w for files. # -d:: # Also clean directories. Perhaps add and their contents to prevent bad surprises. Too late :-) filelist=$(mktemp -t gitlsfiles.XX) git-ls-files --others $EXCLUDE $filelist save_IFS=$IFS IFS=$'\n' for file in $(cat $filelist); do Why can't you use git-ls-files | IFS=$'\n' while ? Good idea. IFS=$save_IFS if [ -d $file ]; then if [ $cleandir ]; then # Try really hard by changing permissions chmod -R 700 $file rm -rf $file fi An error message would be in order otherwise, I guess. You mean, list directories if -d is not specified? Good idea. Also, the latest revision included the -v option for verbose - it would show everything that gets deleted. return I suppose you mean continue? I'm not really sure what does return do here, if it jumps out of the do block or what, and continue is nicely explicit. :-) My error, it was fixed soon after I posted the script. -- 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
Re: New script: cg-clean
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. On Fri, 2005-08-12 at 01:29 +0200, Petr Baudis wrote: 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). Is that fixed already? It turn out it's quite tricky. git-ls-files doesn't distinguish between known and unknown directories. In the long term, I would prefer to have directory information in the index file - to make this kind of tasks easier, allow juggling with empty directories etc. One way to do it would be to check all cached files and find all directories they are in. Another approach would involve git-ls-tree -r, but I don't think it would be right because we work with cache and current files, not with committed data (but my knowledge is limited to make a call - I still need to read the documentation about git). Yes, we should certainly follow the index, otherwise you will e.g. lose the files added by cg-add but not committed yet. -- Petr Pasky Baudis Stuff: http://pasky.or.cz/ If you want the holes in your knowledge showing up try teaching someone. -- Alan Cox - 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
Re: New script: cg-clean
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.XX) 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
Re: New script: cg-clean
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? (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? (iii) Makes it any sense to remove only special files? (iv) -r implies being recursive, but it has nothing to do with that here. (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? Thanks, -- Petr Pasky Baudis Stuff: http://pasky.or.cz/ Espy be careful, some twit might quote you out of context.. - 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
Re: New script: cg-clean
In message [EMAIL PROTECTED] Pavel Roskin wrote: Please consider this script for Cogito. ... # OPTIONS # --- # -i:: # Clean files ignored by cg-status, such as object files. May I suggest to give -i the standard --interactive meaning (= prompt before removal) like with rm etc. ? Thanks. Wolfgang Denk -- Software Engineering: Embedded and Realtime Systems, Embedded Linux Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: [EMAIL PROTECTED] How come everyone's going so slow if it's called rush hour? - 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