Closed Bug 208714 Opened 21 years ago Closed 15 years ago

checksetup.pl dies when it cannot remove $datadir/template

Categories

(Bugzilla :: Installation & Upgrading, defect)

2.17.4
defect
Not set
minor

Tracking

()

RESOLVED FIXED
Bugzilla 3.6

People

(Reporter: jpyeron, Assigned: mkanat)

References

Details

Attachments

(1 file, 10 obsolete files)

User-Agent:       Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; .NET CLR 1.0.3705)
Build Identifier: 

checksetup.pl was able to remove all of the files.
but since one was open (hence a directory handle was still valid)
it could not unlink the parent directory.

if it whined non-fatal then tried to recompile
it would of found that the dirs were completely empty and could proceed anyways.


suggested solution would be to verify that there are no NON-DIR entries under 
the data/template as a check of complete deletion.

if then a subsequent write error occurs then whine (fatal) about that too.

OTHERWISE you have to track down which process is open, and close it. (This was 
inconvenient since it was my text editor which had much work I was not ready to 
save/loose the undo buffer)


Reproducible: Always

Steps to Reproduce:
Summary: checksetup.pl whines about not being able to remove data/templates → checksetup.pl whines (fatal) about not being able to remove data/templates dir
Version: unspecified → 2.17.4
> (This was  inconvenient since it was my text editor which had much work I was
> not ready to save/loose the undo buffer)

Why are you editing stuff in data/template? If you want to edit the template,
edit stuff in template/*.

We an't just get write errors, since one of the reasons we delete everything is
to make sure that files which have been deleted from template/ don't end up in
data/template.
I was READING, not editing. besides that is not relevant.

besides what I said was to confirm that all NON-DIR files are gone. 

that means only DIRS maybe left, and STILL whine about it, but dont be fatal
Removing existing compiled templates ...
Can't remove directory data/template/en/default/bug/process: Permission denied
at C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 929
Can't remove directory data/template/en/default/bug: Directory not empty at
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 929
Can't remove directory data/template/en/default: Directory not empty at
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 929
Can't remove directory data/template/en: Directory not empty at
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 929
Can't remove directory data/template: Directory not empty at
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 929


The data/template directory could not be removed. Please
remove it manually and rerun checksetup.pl.

Will attempt to recover...the data/template and sub-directories are empty of
non-directories, proceding anyways...

Precompiling templates ...
Attachment #125205 - Flags: review?(zach)
Attachment #125205 - Flags: review?(matty)
Comment on attachment 125205 [details] [diff] [review]
recover on fail to delete data/template skeleton

and on windows that locks the directory, but still allows the file to be
deleted? I thought open files couldn't be deleted at all.

+ #my DIR;    # how do I do this?

Under perl>=5.6, |my $dir| will work, and opendir will make that into a
filehandle.

However, the best thing to do would be to use File::Find, and have the wanted
function display the error message and exit if it runs into something which
isn't a dir, using something like (untested):

sub {
  if (! -d $File::Find::name) {
    print "....";
    exit 1;
  }
}

Your version will loop forever if theres a symlink loop. It'll also go outside
the directory tree if there is a symlink. File::Find avoids all of that.

The other issue is what if theres somehow a directory with the name of one of
the files we want? If it can't be deleted, this change will let it go.

I still think that this should be an error, and you should have to close your
editor, but I'm not sure what others think.
Attachment #125205 - Flags: review?(zach)
Attachment #125205 - Flags: review?(matty)
Attachment #125205 - Flags: review-
re: and on windows that locks the directory, but still allows the file to be
deleted? 

Yes, this is the case, the file handle will still be valid for any applications
which have it, but no new apps will be able to obtain it. It is just unlinked
from the filesystem, but not paged out of memory.


re: Your version will loop forever if theres a symlink loop. It'll also go
outside
the directory tree if there is a symlink. File::Find avoids all of that.

That is not true unless -d evals true on symlinks. Look closely at the code

ignore special dirs . & ..
if you encounter a NONdir entry abort and return 0;
otherwise it is a dir (-d) recurse

if no NONdirs found return success


re: The other issue is what if theres somehow a directory with the name of one
of the files we want? If it can't be deleted, this change will let it go.

Yes, this is avery good point, I wanted to do ./checksetup.pl --force
but, that would conflict with the establised usage and was going to get messy.
checksetup will still fail when the template is tired to be compiled (right?)
if the file exists.


re: I still think that this should be an error, and you should have to close
your editor, but I'm not sure what others think. 

But if I have 19 important OTHER files open, that too much to ask (i know it
should release the dir handle, but it is 11 year old software).
Attachment #125205 - Attachment is obsolete: true
I tend to agree with Brad on this...  if you want a 100% certain clean compile,
you're going to want all the directories gone, too.
Dave, Brad,

Here is your dredded a dir exists whose name is the name of a template which 
will need to exist.

C:\usr\jpyeron\proj\jBugzilla\Bugzilla\tip>checksetup.pl
<...snip...>
Removing existing compiled templates ...
Can't remove directory data/template/en/default/bug/process: Permission denied 
at C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937
Can't remove directory data/template/en/default/bug: Directory not empty at 
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937
Can't remove directory data/template/en/default: Directory not empty at 
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937
Can't remove directory data/template/en: Directory not empty at 
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937
Can't remove directory data/template: Directory not empty at 
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937


The data/template directory could not be removed. Please
remove it manually and rerun checksetup.pl.


C:\usr\jpyeron\proj\jBugzilla\Bugzilla\tip>

and then ...

C:\usr\jpyeron\proj\jBugzilla\Bugzilla\tip>checksetup.pl --force
<...snip...>
Removing existing compiled templates ...
Can't remove directory data/template/en/default/bug/process: Permission denied 
at C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937
Can't remove directory data/template/en/default/bug: Directory not empty at 
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937
Can't remove directory data/template/en/default: Directory not empty at 
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937
Can't remove directory data/template/en: Directory not empty at 
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937
Can't remove directory data/template: Directory not empty at 
C:\usr\jpyeron\proj\JBUGZI~1\Bugzilla\tip\CHECKS~1.PL line 937


The data/template directory could not be removed.
Will attempt to recover or exit...

The data/template and sub-directories are NOW empty
of non-directories, proceding anyways...

Precompiling templates ...
Could not compile bug/process/midair.html.tmpl: cache failed to write 
midair.html.tmpl: Permission denied

C:\usr\jpyeron\proj\jBugzilla\Bugzilla\tip>
as you can see from comment 7

the checksetup still fails with a usable message when this condition exists.

I dont see how this would hinder operation if the patch is included.
But more over, without the patch, operation is hindered. This also places some 
headway for other "forcing" operations in checksetup
standard triage jazz
Severity: minor → trivial
Priority: -- → P5
Target Milestone: --- → Future
re comment 9:

Minor
 minor loss of function, or other problem where easy workaround is present  

Trivial
 cosmetic problem like misspelled words or misaligned text  

Could you please justify how this is "Trivial"? This is a minor problem where 
checksetup assumes that it cannot complete its task when it might be able to. 
The easy workaround is to free the OS resources which are in conflict.

Severity: trivial → minor
or the patch attachment 125209 [details] [diff] [review].
Attachment #125209 - Attachment is obsolete: true
Attachment #127893 - Flags: review?(bbaetz)
Comment on attachment 127893 [details] [diff] [review]
recover on fail to delete data/template skeleton 

You need to use file::Find, not opendir/readdir.
Attachment #127893 - Flags: review?(bbaetz) → review-
What is your rationale?

The File::Find architecture seems awkward and unclear. Further it is unclear if 
it can short-circuit.
it also increases dependencies:

use File::Find;
please review nofiles2 vs nofiles

they both work.

I am still looking for a rationale to use File::Find (which uses
opendir/readdir) vs directly using opendir/readdir.

Can specific advantages / disadvantages be listed?
Attachment #127893 - Attachment is obsolete: true
Comment on attachment 128076 [details] [diff] [review]
recover on fail to delete data/template skeleton 

this patch has both code sets included. Please justify why File::Find is more
preferable.

nofiles2 (File::Find) is being used in this patch.
Attachment #128076 - Flags: review?(bbaetz)
Refixed the symlink issue. Oops.
Attachment #128076 - Attachment is obsolete: true
Attachment #128079 - Flags: review?(bbaetz)
Attachment #128076 - Flags: review?(bbaetz)
Our perl guru is back, Yea!!!!

So it now short circuits,
handles mac file system
uses File::Find
no globals
no extra subs


here is the jist:
 my $res=1;
 eval{find(sub{if(!-d){$res=0;die;}},$cdir);};
 return $res;

only caveat may be if inside the eval block an exception is thrown which is not
handled, may lead to false +?

we looking into this.
Attachment #128079 - Attachment is obsolete: true
added the obscure/unforeseen error checking
Attachment #128111 - Attachment is obsolete: true
Attachment #128115 - Flags: review?(bbaetz)
Attachment #128079 - Flags: review?(bbaetz)
Correct me if I'm wrong, but my understanding of this patch is to do the following:

If data/templates was not removed when we attempted to remove it, see if there
are only directories in data/templates.

If there are only directories in data/templates and --force was passed, don't
throw a fatal error and move on.

If --force was passed but data/templates contains non-directories, die anyway.

If --force was not passed, die.

It appears that the use of the --force option is not documented. Am I missing
something? Also, should the option be named --force-delete-templates (or
something like that) to define what exactly is being forced?

Am I correct with this logic?
re: Am I correct with this logic?

yes

re: It appears that the use of the --force option is not documented. Am I 
missing something? Also, should the option be named --force-delete-templates (or
something like that) to define what exactly is being forced?

--force has never existed before.
I decided to add a general --force for this since it adds the "logic" for other 
issues, not discussed here.

why not --force-delete....?
it would add much to the checksetup file. Since the developers have frowned on 
mutations like this, even non-standard operations like not deleting template 
dirs, it seemed OK to generalize all FORCE operations. But this is for a 
different BUG/RFE


Comment on attachment 128115 [details] [diff] [review]
recover on fail to delete data/template skeleton

Add a bit more spacing/newlines arround the eval line, and r=bbaetz.
Attachment #128115 - Flags: review?(bbaetz) → review+
something like?:

eval
{
 find
 (
  sub
  {
   if(!-d)
   {
    $res=0;die;
   }
  }
  ,$cdir
 );
};
Jason, I would think something more like: 

eval {
  find (
    sub {if(!-d){
            $res=0;die;}}
  ,$cdir);
};

(that's pretty ugly too, but what you pasted before is a lot of lines). *Sigh*
there's no pretty way to format find() calls. 

I'd be happy to check this in for you once it has approval.

Also, how do we plan to address the documentation of the --force switch? Perhaps
it should tell the user they can use --force when you say that data/templates
could not be removed? 

Zach
Comment on attachment 128115 [details] [diff] [review]
recover on fail to delete data/template skeleton

>+my $force;
>+if ($ARGV[0] && $ARGV[0] eq "--force") {
>+    # jpyeron@pyerotechnics.com Bug #208714 
>+    shift @ARGV;
>+    $force = 1;
>+}

What if $ARGV[0] is some other switch (--silent perhaps?) and --force is in
$ARGV[1]? I still don't like the idea of using just --force? Force what to
happen?
Added some formatting to ?everyone's? liking.
Added some comments to the --force section
 They included usage info, warnings, etc.

document??? where should --force be documented. I looked for the silent docs
and not found.

C:\...\Bugzilla\tip\docs>grep -Ri "silent" *

C:\...\Bugzilla\tip\docs>grep -Ri "interactive" *

C:\...\Bugzilla\tip\docs>
Attachment #128115 - Attachment is obsolete: true
Attachment #130753 - Flags: review?(bbaetz)
> Perhaps it should tell the user they can use --force when ...


This is a very BAD idea.

Document it in the manual, but never encourage the --force option to be used.

Think how dangerous it is to do:

rm -f

rpm -if kernel.rpm

These applications never **suggest** a force.

there is something wrong if a --force is needed.

Ex: you do not have a correct lib installed, you have files open in an editor 
still, etc.

--force says, hey program I know you think it cannot be done or handled but I 
know better, against all the your developers have said.

which is sometime the case, hence the need for --force.


Where in the manual is non-interactive operation covered?


Comment on attachment 130753 [details] [diff] [review]
recover on fail to delete data/template skeleton

Looks fine.
so can we get this to patch???
Flags: approval?
Jason,

Why does --force need to be the first switch on the commandline? I think it would confuse a user 
using other switches to have to put --force first instead of second or third. 
re comment 31 and comment 26:

a confused user should not be using a --force option ever!

but kidding aside:

I put --force first since I could use shift to keep checksetup.pl's code the 
same, that is the least amount of side effects.

until it is proposed to redo how checksetup is structured then it does not make 
sense to put a 'tar' like arg proccessing capabilites.

Blocks: 224417
Clearing approval request pending review of the current patch.  bbaetz?
Status: UNCONFIRMED → NEW
Ever confirmed: true
Flags: approval?
Target Milestone: Future → Bugzilla 2.18
All 2.18 bugs that haven't been touched in over 60 days and aren't flagged as
blockers are getting pushed out to 2.20
Target Milestone: Bugzilla 2.18 → Bugzilla 2.20
Comment on attachment 130753 [details] [diff] [review]
recover on fail to delete data/template skeleton

a pathc was approved last year when is it going to get checked in?
Attachment #130753 - Flags: review?(bbaetz) → review?
Attached patch bugzilla-208714-v1.11.diff (obsolete) — Splinter Review
some bit rot fixed...
Attachment #130753 - Attachment is obsolete: true
Attachment #160894 - Flags: review?
Attached patch bugzilla-208714-v1.12.diff (obsolete) — Splinter Review
fixed some bit rot (oops on #11)
Attachment #160894 - Attachment is obsolete: true
Attachment #160894 - Flags: review?
Attachment #160895 - Flags: review?
docs for --force are in Bug 224417
Comment on attachment 160895 [details] [diff] [review]
bugzilla-208714-v1.12.diff

>+# --force must always be first

You can use "grep" to relax this requirement pretty easily.

>+    # jpyeron@pyerotechnics.com Bug #208714

It's better not to annotate code in this way. Such annotations can get out of
date or confuse, and get silly when everyone does them, and anyway, that's what
CVS blame is for.

>+sub nofiles
>+{
>+ use File::Find;
>+ my ($cdir)=@_;
>+ my $res=1;
>+ eval
>+ {
>+  find( sub { if(!-d) {$res=0;die;} }
>+       ,$cdir);
>+ };
>+ $res=0 if defined $@ and $@ ne '';
>+ return $res;
>+}

This sub doesn't follow the normal spacing/indenting rules, and it definitely
needs a comment or two explaining what's going on :-)

>+            print "The $datadir/template directory could not be removed.\n";
>+            print "Will attempt to recover or exit...";
>+            exit unless (nofiles('$datadir/template'));
>+            print "\n\nThe $datadir/template and sub-directories are NOW empty\n";
>+            print "of non-directories, proceding anyways...\n\n";

Nit: "anyway" is correct English.

Gerv
Attachment #160895 - Flags: review? → review-
Moving documentation issue back here, now that we have a documentation flag that
is tracked separately from the rest of the bug.  This way it also doesn't show
up on the docs team's plate until the bug is resolved.
No longer blocks: 224417
Flags: documentation?
*** Bug 224417 has been marked as a duplicate of this bug. ***
Comment on attachment 130753 [details] [diff] [review]
recover on fail to delete data/template skeleton

Removing r? from obsolete patch
Attachment #130753 - Flags: review?
This bug has not been touched by its owner in over six months, even though it is
targeted to 2.20, for which the freeze is 10 days away. Unsetting the target
milestone, on the assumption that nobody is actually working on it or has any
plans to soon.

If you are the owner, and you plan to work on the bug, please give it a real
target milestone. If you are the owner, and you do *not* plan to work on it,
please reassign it to nobody@bugzilla.org or a .bugs component owner. If you are
*anybody*, and you get this comment, and *you* plan to work on the bug, please
reassign it to yourself if you have the ability.
Target Milestone: Bugzilla 2.20 → ---
Assignee: zach → jpyeron
when is a good time to fix this?

I dont have much time to spend on making patches right now, so if I could get 
it done a day after bug 285722 lands, can it get reviewed and checked in???


it should of happened back in july 2003, but ...
(In reply to comment #44)
> I dont have much time to spend on making patches right now, so if I could get 
> it done a day after bug 285722 lands, can it get reviewed and checked in???

  If it passes review, I'd imagine that that's always the case. :-) So that's a
"yes," but nobody's promising a r+.
it has already passed review, before, sigh!


QA Contact: mattyt-bugzilla → default-qa
--force has not been implemented yet. So there is nothing to add to documentation.
Flags: documentation?
Actually, I think the solution here is just to make $datadir/template non-deletion non-fatal.
OS: Windows 2000 → All
Priority: P5 → --
Hardware: x86 → All
Summary: checksetup.pl whines (fatal) about not being able to remove data/templates dir → checksetup.pl dies when it cannot remove $datadir/template
Target Milestone: --- → Bugzilla 3.6
Attached patch v13Splinter Review
Ha! After all these years, I finally coded up the solution to this problem. We just move the data/template directory if we can't remove it, because we're allowed to move things around on the same partition even if we can't delete them.

Granting myself review as module owner.
Assignee: jpyeron → mkanat
Attachment #160895 - Attachment is obsolete: true
Status: NEW → ASSIGNED
Attachment #395518 - Flags: review+
Checking in Bugzilla/Template.pm;
/cvsroot/mozilla/webtools/bugzilla/Bugzilla/Template.pm,v  <--  Template.pm
new revision: 1.107; previous revision: 1.106
done
Checking in template/en/default/setup/strings.txt.pl;
/cvsroot/mozilla/webtools/bugzilla/template/en/default/setup/strings.txt.pl,v  <--  strings.txt.pl
new revision: 1.16; previous revision: 1.15
done
Status: ASSIGNED → RESOLVED
Closed: 15 years ago
Flags: approval+
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: