PageRenderTime 456ms CodeModel.GetById 232ms app.highlight 11ms RepoModel.GetById 210ms app.codeStats 0ms

/PC/VS7.1/python.iss

http://unladen-swallow.googlecode.com/
Unknown | 346 lines | 275 code | 71 blank | 0 comment | 0 complexity | d3b32b6a768c63972d1a44e3e4dd9ac3 MD5 | raw file
  1; Script generated by the Inno Setup Script Wizard.
  2; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
  3
  4; This is the whole ball of wax for an Inno installer for Python.
  5; To use, download Inno Setup from http://www.jrsoftware.org/isdl.htm/,
  6; install it, and double-click on this file.  That launches the Inno
  7; script compiler.  The GUI is extemely simple, and has only one button
  8; you may not recognize instantly:  click it.  You're done.  It builds
  9; the installer into PCBuild/Python-2.2a1.exe.  Size and speed of the
 10; installer are competitive with the Wise installer; Inno uninstall
 11; seems much quicker than Wise (but also feebler, and the uninstall
 12; log is in some un(human)readable binary format).
 13;
 14; What's Done
 15; -----------
 16; All the usual Windows Python files are installed by this now.
 17; All the usual Windows Python Start menu entries are created and
 18; work fine.
 19; .py, .pyw, .pyc and .pyo extensions are registered.
 20;     PROBLEM:  Inno uninstall does not restore their previous registry
 21;               associations (if any).  Wise did.  This will make life
 22;               difficult for alpha (etc) testers.
 23; The Python install is fully functional for "typical" uses.
 24;
 25; What's Not Done
 26; ---------------
 27; None of "Mark Hammond's" registry entries are written.
 28; No installation of files is done into the system dir:
 29;     The MS DLLs aren't handled at all by this yet.
 30;     Python22.dll is unpacked into the main Python dir.
 31;
 32; Inno can't do different things on NT/2000 depending on whether the user
 33; has Admin privileges, so I don't know how to "solve" either of those,
 34; short of building two installers (one *requiring* Admin privs, the
 35; other not doing anything that needs Admin privs).
 36;
 37; Inno has no concept of variables, so lots of lines in this file need
 38; to be fiddled by hand across releases.  Simplest way out:  stick this
 39; file in a giant triple-quoted r-string (note that backslashes are
 40; required all over the place here -- forward slashes DON'T WORK in
 41; Inno), and use %(yadda)s string interpolation to do substitutions; i.e.,
 42; write a very simple Python program to *produce* this script.
 43
 44[Setup]
 45AppName=Python and combined Win32 Extensions
 46AppVerName=Python 2.2.2 and combined Win32 Extensions 150
 47AppId=Python 2.2.2.150
 48AppVersion=2.2.2.150
 49AppCopyright=Python is Copyright Š 2001 Python Software Foundation. Win32 Extensions are Copyright Š 1996-2001 Greg Stein and Mark Hammond.
 50
 51; Default install dir; value of {app} later (unless user overrides).
 52; {sd} = system root drive, probably "C:".
 53DefaultDirName={sd}\Python22
 54;DefaultDirName={pf}\Python
 55
 56; Start menu folder name; value of {group} later (unless user overrides).
 57DefaultGroupName=Python 2.2
 58
 59; Point SourceDir to one above PCBuild = src.
 60; means this script can run unchanged from anyone's CVS tree, no matter
 61; what they called the top-level directories.
 62SourceDir=.
 63OutputDir=..
 64OutputBaseFilename=Python-2.2.2-Win32-150-Setup
 65
 66AppPublisher=PythonLabs at Digital Creations
 67AppPublisherURL=http://www.python.org
 68AppSupportURL=http://www.python.org
 69AppUpdatesURL=http://www.python.org
 70
 71AlwaysCreateUninstallIcon=true
 72ChangesAssociations=true
 73UninstallLogMode=new
 74AllowNoIcons=true
 75AdminPrivilegesRequired=true
 76UninstallDisplayIcon={app}\pyc.ico
 77WizardDebug=false
 78
 79; The fewer screens the better; leave these commented.
 80
 81Compression=bzip
 82InfoBeforeFile=LICENSE.txt
 83;InfoBeforeFile=Misc\NEWS
 84
 85; uncomment the following line if you want your installation to run on NT 3.51 too.
 86; MinVersion=4,3.51
 87
 88[Types]
 89Name: normal; Description: Select desired components; Flags: iscustom
 90
 91[Components]
 92Name: main; Description: Python and Win32 Extensions; Types: normal
 93Name: docs; Description: Python documentation (HTML); Types: normal
 94Name: tk; Description: TCL/TK, tkinter, and Idle; Types: normal
 95Name: tools; Description: Python utility scripts (Tools\); Types: normal
 96Name: test; Description: Python test suite (Lib\test\); Types: normal
 97
 98[Tasks]
 99Name: extensions; Description: Register file associations (.py, .pyw, .pyc, .pyo); Components: main; Check: IsAdminLoggedOn
100
101[Files]
102; Caution:  Using forward slashes instead screws up in amazing ways.
103; Unknown:  By the time Components (and other attrs) are added to these lines, they're
104; going to get awfully long.  But don't see a way to continue logical lines across
105; physical lines.
106
107Source: LICENSE.txt; DestDir: {app}; CopyMode: alwaysoverwrite
108Source: README.txt; DestDir: {app}; CopyMode: alwaysoverwrite
109Source: News.txt; DestDir: {app}; CopyMode: alwaysoverwrite
110Source: *.ico; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
111
112Source: python.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
113Source: pythonw.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
114Source: w9xpopen.exe; DestDir: {app}; CopyMode: alwaysoverwrite; Components: main
115
116
117Source: DLLs\tcl83.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
118Source: DLLs\tk83.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
119Source: tcl\*.*; DestDir: {app}\tcl; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
120
121Source: sysdir\python22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: sharedfile restartreplace
122Source: sysdir\PyWinTypes22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: restartreplace sharedfile
123Source: sysdir\pythoncom22.dll; DestDir: {sys}; CopyMode: alwaysskipifsameorolder; Components: main; Flags: restartreplace sharedfile
124
125Source: DLLs\_socket.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
126Source: libs\_socket.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
127
128Source: DLLs\_sre.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
129Source: libs\_sre.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
130
131Source: DLLs\_symtable.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
132Source: libs\_symtable.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
133
134Source: DLLs\_testcapi.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
135Source: libs\_testcapi.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
136
137Source: DLLs\_tkinter.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: tk
138Source: libs\_tkinter.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: tk
139
140Source: DLLs\bsddb.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
141Source: libs\bsddb.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
142
143Source: DLLs\mmap.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
144Source: libs\mmap.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
145
146Source: DLLs\parser.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
147Source: libs\parser.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
148
149Source: DLLs\pyexpat.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
150Source: libs\pyexpat.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
151
152Source: DLLs\select.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
153Source: libs\select.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
154
155Source: DLLs\unicodedata.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
156Source: libs\unicodedata.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
157
158Source: DLLs\_winreg.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
159Source: libs\_winreg.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
160
161Source: DLLs\winsound.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
162Source: libs\winsound.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
163
164Source: DLLs\zlib.pyd; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
165Source: libs\zlib.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
166
167Source: libs\python22.lib; DestDir: {app}\libs; CopyMode: alwaysoverwrite; Components: main
168
169Source: DLLs\expat.dll; DestDir: {app}\DLLs; CopyMode: alwaysoverwrite; Components: main
170
171
172
173Source: Lib\*.py; DestDir: {app}\Lib; CopyMode: alwaysoverwrite; Components: main
174Source: Lib\compiler\*.*; DestDir: {app}\Lib\compiler; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
175Source: Lib\distutils\*.*; DestDir: {app}\Lib\distutils; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
176Source: Lib\email\*.*; DestDir: {app}\Lib\email; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
177Source: Lib\encodings\*.*; DestDir: {app}\Lib\encodings; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
178Source: Lib\hotshot\*.*; DestDir: {app}\Lib\hotshot; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
179Source: Lib\lib-old\*.*; DestDir: {app}\Lib\lib-old; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
180Source: Lib\xml\*.*; DestDir: {app}\Lib\xml; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
181Source: Lib\hotshot\*.*; DestDir: {app}\Lib\hotshot; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
182Source: Lib\test\*.*; DestDir: {app}\Lib\test; CopyMode: alwaysoverwrite; Components: test; Flags: recursesubdirs
183
184Source: Lib\site-packages\README.txt; DestDir: {app}\Lib\site-packages; CopyMode: alwaysoverwrite; Components: main
185
186Source: Lib\site-packages\PyWin32.chm; DestDir: {app}\Lib\site-packages; CopyMode: alwaysoverwrite; Components: docs
187Source: Lib\site-packages\win32\*.*; DestDir: {app}\Lib\site-packages\win32; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
188Source: Lib\site-packages\win32com\*.*; DestDir: {app}\Lib\site-packages\win32com; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
189Source: Lib\site-packages\win32comext\*.*; DestDir: {app}\Lib\site-packages\win32comext; CopyMode: alwaysoverwrite; Components: main; Flags: recursesubdirs
190
191Source: Lib\lib-tk\*.py; DestDir: {app}\Lib\lib-tk; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
192
193Source: include\*.h; DestDir: {app}\include; CopyMode: alwaysoverwrite; Components: main
194
195Source: Tools\idle\*.*; DestDir: {app}\Tools\idle; CopyMode: alwaysoverwrite; Components: tk; Flags: recursesubdirs
196
197Source: Tools\pynche\*.*; DestDir: {app}\Tools\pynche; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
198Source: Tools\scripts\*.*; DestDir: {app}\Tools\Scripts; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
199Source: Tools\webchecker\*.*; DestDir: {app}\Tools\webchecker; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
200Source: Tools\versioncheck\*.*; DestDir: {app}\Tools\versioncheck; CopyMode: alwaysoverwrite; Components: tools; Flags: recursesubdirs
201
202Source: Doc\*.*; DestDir: {app}\Doc; CopyMode: alwaysoverwrite; Flags: recursesubdirs; Components: docs
203
204
205[Icons]
206Name: {group}\Python (command line); Filename: {app}\python.exe; WorkingDir: {app}; Components: main
207Name: {group}\Python Manuals; Filename: {app}\Doc\index.html; WorkingDir: {app}; Components: docs
208Name: {group}\Win32 Extensions Help; Filename: {app}\Lib\site-packages\PyWin32.chm; WorkingDir: {app}\Lib\site-packages; Components: docs
209Name: {group}\Module Docs; Filename: {app}\pythonw.exe; WorkingDir: {app}; Parameters: """{app}\Tools\Scripts\pydoc.pyw"""; Components: tools
210Name: {group}\IDLE (Python GUI); Filename: {app}\pythonw.exe; WorkingDir: {app}; Parameters: """{app}\Tools\idle\idle.pyw"""; Components: tools
211
212[Registry]
213; Register .py
214Tasks: extensions; Root: HKCR; Subkey: .py; ValueType: string; ValueName: ; ValueData: Python File; Flags: uninsdeletevalue
215Tasks: extensions; Root: HKCR; Subkey: .py; ValueType: string; ValueName: Content Type; ValueData: text/plain; Flags: uninsdeletevalue
216Tasks: extensions; Root: HKCR; Subkey: Python File; ValueType: string; ValueName: ; ValueData: Python File; Flags: uninsdeletekey
217Tasks: extensions; Root: HKCR; Subkey: Python File\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Py.ico
218Tasks: extensions; Root: HKCR; Subkey: Python File\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\python.exe"" ""%1"" %*"
219
220; Register .pyc
221Tasks: extensions; Root: HKCR; Subkey: .pyc; ValueType: string; ValueName: ; ValueData: Python CompiledFile; Flags: uninsdeletevalue
222Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile; ValueType: string; ValueName: ; ValueData: Compiled Python File; Flags: uninsdeletekey
223Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\pyc.ico
224Tasks: extensions; Root: HKCR; Subkey: Python CompiledFile\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\python.exe"" ""%1"" %*"
225
226; Register .pyo
227Tasks: extensions; Root: HKCR; Subkey: .pyo; ValueType: string; ValueName: ; ValueData: Python CompiledFile; Flags: uninsdeletevalue
228
229; Register .pyw
230Tasks: extensions; Root: HKCR; Subkey: .pyw; ValueType: string; ValueName: ; ValueData: Python NoConFile; Flags: uninsdeletevalue
231Tasks: extensions; Root: HKCR; Subkey: .pyw; ValueType: string; ValueName: Content Type; ValueData: text/plain; Flags: uninsdeletevalue
232Tasks: extensions; Root: HKCR; Subkey: Python NoConFile; ValueType: string; ValueName: ; ValueData: Python File (no console); Flags: uninsdeletekey
233Tasks: extensions; Root: HKCR; Subkey: Python NoConFile\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\Py.ico
234Tasks: extensions; Root: HKCR; Subkey: Python NoConFile\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\pythonw.exe"" ""%1"" %*"
235
236
237; Python Registry Keys
238Root: HKLM; Subkey: SOFTWARE\Python; Flags: uninsdeletekeyifempty; Check: IsAdminLoggedOn
239Root: HKLM; Subkey: SOFTWARE\Python\PythonCore; Flags: uninsdeletekeyifempty
240Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2; Flags: uninsdeletekeyifempty
241Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath; ValueData: "{app}\Lib;{app}\DLLs"; Flags: uninsdeletekeyifempty
242Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\tk; ValueData: {app}\Lib\lib-tk; Flags: uninsdeletekey; Components: tk
243Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\win32; ValueData: "{app}\lib\site-packages\win32;{app}\lib\site-packages\win32\lib"; Flags: uninsdeletekey
244Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\PythonPath\win32com; ValueData: C:\Python\lib\site-packages; Flags: uninsdeletekey
245Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules; Flags: uninsdeletekeyifempty
246Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules\pythoncom; ValueData: {sys}\pythoncom22.dll; Flags: uninsdeletekey
247Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Modules\pywintypes; ValueData: {sys}\PyWinTypes22.dll; Flags: uninsdeletekey
248Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\InstallPath; ValueData: {app}; Flags: uninsdeletekeyifempty; ValueType: string
249Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\InstallPath\InstallGroup; ValueData: {group}; Flags: uninsdeletekey
250Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help; Flags: uninsdeletekeyifempty
251Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help\Main Python Documentation; ValueType: string; ValueData: {app}\Doc\index.html; Flags: uninsdeletekey; Components: docs
252Root: HKLM; Subkey: SOFTWARE\Python\PythonCore\2.2\Help\Python Win32 Documentation; ValueType: string; ValueData: {app}\lib\site-packages\PyWin32.chm; Flags: uninsdeletekey; Components: docs
253
254[_ISTool]
255EnableISX=true
256
257
258[Code]
259Program Setup;
260
261Function IsAdminNotLoggedOn(): Boolean;
262begin
263  Result := Not IsAdminLoggedOn();
264end;
265
266begin
267end.
268
269
270
271
272[UninstallDelete]
273Name: {app}\Lib\compiler\*.pyc; Type: files
274Name: {app}\Lib\compiler\*.pyo; Type: files
275Name: {app}\Lib\compiler; Type: dirifempty
276Name: {app}\Lib\distutils\command\*.pyc; Type: files
277Name: {app}\Lib\distutils\command\*.pyo; Type: files
278Name: {app}\Lib\distutils\command; Type: dirifempty
279Name: {app}\Lib\distutils\*.pyc; Type: files
280Name: {app}\Lib\distutils\*.pyo; Type: files
281Name: {app}\Lib\distutils; Type: dirifempty
282Name: {app}\Lib\email\test\*.pyc; Type: files
283Name: {app}\Lib\email\test\*.pyo; Type: files
284Name: {app}\Lib\email\test; Type: dirifempty
285Name: {app}\Lib\email\*.pyc; Type: files
286Name: {app}\Lib\email\*.pyo; Type: files
287Name: {app}\Lib\email; Type: dirifempty
288Name: {app}\Lib\encodings\*.pyc; Type: files
289Name: {app}\Lib\encodings\*.pyo; Type: files
290Name: {app}\Lib\encodings; Type: dirifempty
291Name: {app}\Lib\hotshot\*.pyc; Type: files
292Name: {app}\Lib\hotshot\*.pyo; Type: files
293Name: {app}\Lib\hotshot; Type: dirifempty
294Name: {app}\Lib\lib-old\*.pyc; Type: files
295Name: {app}\Lib\lib-old\*.pyo; Type: files
296Name: {app}\Lib\lib-old; Type: dirifempty
297Name: {app}\Lib\lib-tk\*.pyc; Type: files
298Name: {app}\Lib\lib-tk\*.pyo; Type: files
299Name: {app}\Lib\lib-tk; Type: dirifempty
300Name: {app}\Lib\test\*.pyc; Type: files
301Name: {app}\Lib\test\*.pyo; Type: files
302Name: {app}\Lib\test; Type: dirifempty
303Name: {app}\Lib\xml\dom\*.pyc; Type: files
304Name: {app}\Lib\xml\dom\*.pyo; Type: files
305Name: {app}\Lib\xml\dom; Type: dirifempty
306Name: {app}\Lib\xml\parsers\*.pyc; Type: files
307Name: {app}\Lib\xml\parsers\*.pyo; Type: files
308Name: {app}\Lib\xml\parsers; Type: dirifempty
309Name: {app}\Lib\xml\sax\*.pyc; Type: files
310Name: {app}\Lib\xml\sax\*.pyo; Type: files
311Name: {app}\Lib\xml\sax; Type: dirifempty
312Name: {app}\Lib\xml\*.pyc; Type: files
313Name: {app}\Lib\xml\*.pyo; Type: files
314Name: {app}\Lib\xml; Type: dirifempty
315
316Name: {app}\Lib\site-packages\win32; Type: filesandordirs
317Name: {app}\Lib\site-packages\win32com; Type: filesandordirs
318Name: {app}\Lib\site-packages\win32comext; Type: filesandordirs
319Name: {app}\Lib\site-packages\pythoncom.py*; Type: files
320Name: {app}\Lib\site-packages; Type: dirifempty
321
322Name: {app}\Lib\*.pyc; Type: files
323Name: {app}\Lib; Type: dirifempty
324
325Name: {app}\Tools\pynche\*.pyc; Type: files
326Name: {app}\Tools\pynche\*.pyo; Type: files
327Name: {app}\Tools\pynche; Type: dirifempty
328
329Name: {app}\Tools\idle\*.pyc; Type: files
330Name: {app}\Tools\idle\*.pyo; Type: files
331Name: {app}\Tools\idle; Type: dirifempty
332
333Name: {app}\Tools\scripts\*.pyc; Type: files
334Name: {app}\Tools\scripts\*.pyo; Type: files
335Name: {app}\Tools\scripts; Type: dirifempty
336
337Name: {app}\Tools\versioncheck\*.pyc; Type: files
338Name: {app}\Tools\versioncheck\*.pyo; Type: files
339Name: {app}\Tools\versioncheck; Type: dirifempty
340
341Name: {app}\Tools\webchecker\*.pyc; Type: files
342Name: {app}\Tools\webchecker\*.pyo; Type: files
343Name: {app}\Tools\webchecker; Type: dirifempty
344
345Name: {app}\Tools; Type: dirifempty
346