Re: New script: cg-clean

2005-08-11 Thread Pavel Roskin
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

2005-08-11 Thread Petr Baudis
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

2005-08-06 Thread Pavel Roskin
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

2005-07-10 Thread Petr Baudis
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

2005-07-08 Thread Wolfgang Denk
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