classification
Title: os.makedirs(): Add a keyword argument to suppress "File exists" exception
Type: enhancement Stage: commit review
Components: Library (Lib) Versions: Python 3.2
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: terry.reedy Nosy List: Arfrever, belopolsky, draghuram, eric.araujo, georg.brandl, ggenellina, giampaolo.rodola, gvanrossum, ijmorlan, terry.reedy, ysj.ray, zooko
Priority: critical Keywords: patch

Created on 2010-07-19 08:47 by ysj.ray, last changed 2014-03-28 22:27 by gvanrossum. This issue is now closed.

Files
File name Uploaded Description Edit
mkdir_py3k.diff ysj.ray, 2010-07-19 08:57
mkdir_py3k_updated.diff ysj.ray, 2010-07-20 03:14 updated path against py3k.
mkdir_py3k_updated.diff ysj.ray, 2010-07-21 04:23 patch against py3k
mkdir_py3k.diff ysj.ray, 2010-07-22 05:34 patch against py3k.
mkdir.diff ysj.ray, 2010-07-28 12:42 patch against py3k
mkdir.diff ysj.ray, 2010-08-03 11:56 patch against py3k
mkdir.diff ysj.ray, 2010-08-07 08:56 patch against py3k
mkdirs.tr.diff terry.reedy, 2010-11-28 03:43 + version-added, News, Acks entries
Messages (46)
msg110719 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-19 08:47
As discussed in python-dev mailing list, something should be add to os.mkdir() and os.makedirs() to simulate the shell's "mkdir -p" function, that is, suppress the OSError exception if the target directory exists. 

Here is a patch against py3k, with code, test and doc. I add an "ensure_exist" keyword argument for both os.mkdir() and os.makedirs(), indicates weather an OSError is raised if the target directory already exists.

Since I've no windows environment, I only tested the patch on Unix. Hope someone could help test it on windows.
msg110720 - (view) Author: Giampaolo Rodola' (giampaolo.rodola) * (Python committer) Date: 2010-07-19 08:50
I don't think this can go into 2.7.
msg110721 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-19 08:57
I update the patch since an problem is found in doc/library/os.rst.
msg110750 - (view) Author: Isaac Morland (ijmorlan) Date: 2010-07-19 13:39
This exact issue has already been discussed in Issue 1675.
msg110753 - (view) Author: Isaac Morland (ijmorlan) Date: 2010-07-19 13:43
How different is this issue from Issue 1608579, Issue 1239890, Issue 1223238, and Issue 1314067?
msg110757 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-19 13:58
If I understander correctly, Issue 1608579, Issue 1239890, Issue 1223238, and Issue 1314067 all deal with the case that the intermediate directories already exists during creating them caused by race condition, but if the target directory(the leaf directory) already exist due to some reason, the OSError is still raised. This patch is mainly addressed on simulate the "mkdir -p" option, that is, when the target directory exists, no OSError is raised.
msg110770 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-07-19 16:03
Since this is a library issue, it can go into 3.2.
It is definitely a feature request, hence not in 2.7. Code that depends on the exception suppression would crash on an earlier release.

http://mail.python.org/pipermail/python-dev/2010-July/102027.html
Guido said "Well, it really should have behaved like mkdir -p in the first place.", so this is accepted pending patch approval.

The patch includes doc, test, and code patches.

The name 'ensure_exist' for the new parameter strikes me as wrong, as well as too long for something that will nearly always be set to True. The function always ensures that the directory exists. The question is whether it is ok that it exist previously. I strongly suggest something shorter like 'exist_ok' as an alternative.

The name 'excl' used in #

The code looks OK as far as I can read it, but someone else should look at the C code for posimodule-mkdir.

Does the use of 'base = support.TESTFN' ensure that the test junk gets cleaned up?

This versus #1675: the presenting issues are different -- parent race condition leading to error versus leaf existence leading to error. However, the patches are nearly the same and would have much the same effect. The differences:

* Test: 1675 lacks a new test; there should be one.

* New parameter name: they use different names, I do not like either. They use opposite senses -- exist_ok versus exist_bad for the new parameter. I think a good name is more important.

* Location of error suppression: this patches posixfile.mkdir; 1675 wraps it with a new os.mkdir function that does the suppression. I can see an argument for each approach. 

* Propagation to parent directories: this passes exist_ok to parent mkdir(); 1675 passes exist_ok=True, so that it is never an error for parent directories to exist. This is a change in behavior and might be bad for the same reason we do not make exist_ok=True the default. In any case, I believe either patch could be changed to mimic the other.

Thus there are three choices to make before committing.
msg110855 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-20 03:14
Thanks for reviewing!

> The name 'ensure_exist' for the new parameter strikes me as wrong, as well as too long for something that will nearly always be set to True. The function always ensures that the directory exists. The question is whether it is ok that it exist previously. I strongly suggest something shorter like 'exist_ok' as an alternative.


Yes, I guess you'are right, this parameter needs to be shorter.


> Does the use of 'base = support.TESTFN' ensure that the test junk gets cleaned up?

Yes, the MakedirTests.tearDown() method will try to look for the outermost directory of "@base/dir1/dir2/dir3/dir4/dir5/dir6", so it can ensure the test directory is cleaned up.


> * Location of error suppression: this patches posixfile.mkdir; 1675 wraps it with a new os.mkdir function that does the suppression. I can see an argument for each approach.

The purpose of posix_mkdir() is to simulate a shell mkdir command, so I think the function of "-p" option should goes in to this code. A wrapper makes code more complicated.


> * Propagation to parent directories: this passes exist_ok to parent mkdir(); 1675 passes exist_ok=True, so that it is never an error for parent directories to exist. This is a change in behavior and might be bad for the same reason we do not make exist_ok=True the default. In any case, I believe either patch could be changed to mimic the other.

It seems these two ways has the same effect, I have no opinion on which to prefer.


By adopting your parameter naming suggestion and a little coding style change, I update the patch.
msg110991 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-07-21 02:32
Discussion has continued on pydev thread "mkdir -p in python". Some suggested a new function. Others questioned the details of the new behavior. Guido prefers the flag approach and imitation of mkdir -p.

"-1 on a new function (despite the constant-argument
guideline) and +1 on a flag. If it weren't for backwards compatibility
I'd just change os.makedirs() to act like mkdir -p period, but the
last opportunity we had for that was Python 3.0."

So, the patch should either leave behavior untouched or imitate -p behavior. That to me says that the parameter passed to mkdirs should be propagated to each mkdir call, as the 9299 patch does, and not set to a fixed value.

OS imports mkdir for one of posix, nt, os2, or ce modules. Since these do not have private '_xx' names and might be imported directly, I think the C-coded mkdir should have the parameter too, as the 9299 patch already does.

The patch changes posixmodule.c. Are all of posix, nt, os2, and ce created from the one file, or is does the patch need to change other C files?

The patch simply augments the very skimpy docstring with
"[, exist_ok=False]". Please add something after "Create a directory." like "If exist_ok is False, raise BlahError if the path already exists." Many doc strings are so terse as to be barely usable, but this is not a requirement. See help(compile) for one that is complete.
msg110995 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-21 03:04
Thanks for conclusion! I'll try to check and improve my patch.
msg111005 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-21 04:23
I update my patch with improved doc string of posix_mkdir.

By the way, after I search in the source, I could not find the "nt", "os2", "ce" modules, I guess these modules only exist in python source at one time, maybe very earlier releases, but not now.
msg111011 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-07-21 06:41
On windows, I can only import nt, not posix, ce, os2.
>>> import posix
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    import posix
ImportError: No module named posix
>>> import nt
>>> dir(nt)
['F_OK', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'R_OK', 'TMP_MAX', 'W_OK', 'X_OK', '__doc__', '__name__', '__package__', '_exit', '_getfullpathname', 'abort', 'access', 'chdir', 'chmod', 'close', 'closerange', 'device_encoding', 'dup', 'dup2', 'environ', 'error', 'execv', 'execve', 'fstat', 'fsync', 'getcwd', 'getcwdb', 'getpid', 'isatty', 'listdir', 'lseek', 'lstat', 'mkdir', 'open', 'pipe', 'putenv', 'read', 'remove', 'rename', 'rmdir', 'spawnv', 'spawnve', 'startfile', 'stat', 'stat_float_times', 'stat_result', 'statvfs_result', 'strerror', 'system', 'times', 'umask', 'unlink', 'urandom', 'utime', 'waitpid', 'write']
I guessed there might be some trickery because I say the ifdef Windows in posixmodule.c.
msg111014 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2010-07-21 07:08
On Wed, Jul 21, 2010 at 3:32 AM, Terry J. Reedy <report@bugs.python.org> wrote:
>
> Terry J. Reedy <tjreedy@udel.edu> added the comment:
>
> Discussion has continued on pydev thread "mkdir -p in python". Some suggested a new function. Others questioned the details of the new behavior. Guido prefers the flag approach and imitation of mkdir -p.
>
> "-1 on a new function (despite the constant-argument
> guideline) and +1 on a flag. If it weren't for backwards compatibility
> I'd just change os.makedirs() to act like mkdir -p period, but the
> last opportunity we had for that was Python 3.0."
>
> So, the patch should either leave behavior untouched or imitate -p behavior. That to me says that the parameter passed to mkdirs should be propagated to each mkdir call, as the 9299 patch does, and not set to a fixed value.

Hm. I wonder if os.mkdir() should not be left alone (so as to continue
to match the system call most exactly, as is our convention) and the
extra functionality added to os.makedirs() only.
msg111018 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-21 08:00
I found in Modules/posixmodule.c that:


#if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__)) && !defined(__QNX__)
#define INITFUNC PyInit_nt
#define MODNAME "nt"

#elif defined(PYOS_OS2)
#define INITFUNC PyInit_os2
#define MODNAME "os2"

#else
#define INITFUNC PyInit_posix
#define MODNAME "posix"
#endif


I also found the "ce" module in Python Windows CE (http://pythonce.sourceforge.net/) source: Modules/posixmodule.c, seeing http://docs.python.org/py3k/using/windows.html. This means the "nt", "os2", "ce", "posix" module are all implemented in Modules/posixmodule.c.
msg111120 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-07-21 21:04
Guido: "Hm. I wonder if os.mkdir() should not be left alone (so as to continue to match the system call most exactly, as is our convention) and the extra functionality added to os.makedirs() only."

Sticking with that convention seems like a good idea. That would imply wrapping the mkdir call within makedirs as something like

try:
  mkdir(...)
except (<errs to be caught>:
  if not exist_ok:
    raise

mkdir could be changed in the future but not unchanged once changed.

Ray, can you make a simplified patch that leaves posixmodule.c alone, and make sure it passes the old and new tests? I am 99% sure some version will be applied for 3.2.
msg111150 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-22 05:34
Agree! Sure, the functions in os are mainly to simulate the system call but not the system command. This seems like a good suggestion.

So here is the new patch which leave posixmodule.c alone and just wrappers os.mkdir() with try...except... in os.makedirs().
msg111514 - (view) Author: Arfrever Frehtes Taifersar Arahesis (Arfrever) * Date: 2010-07-25 00:15
I suggest to raise exception when target regular file exists:

try:
    mkdir(name, mode)
except OSError as e:
    if not (exist_ok and e.errno == errno.EEXIST and path.isdir(name)):
        raise
msg111517 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-07-25 01:27
Ray, what does mkdir -p do if the last target name exists but is a regular file rather than a directory? A slightly separate question is 'What do we want mkdirs to do (in this case)?'
msg111609 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-26 13:26
Oh, I'm sorry, I forgot about that case. 

I agree with Arfrever, we should suppress the OSError only if the target file exists as a directory, but not other types. That is, the "exist_ok" argument in makedirs() should mean "dir existing is ok", only existing of the exact same thing as we specified to create is ok, not other things. I will fixed this later. 

Besides, I wonder what should we do if the target directory exists but with a different mode than we specified(if we specified the "mode" argument). I guess we should also raise the OSError because the existing thing is not the same as what we want.
msg111612 - (view) Author: Arfrever Frehtes Taifersar Arahesis (Arfrever) * Date: 2010-07-26 13:32
Alternatively you could call os.chmod.
msg111679 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-27 02:20
I feel we do too much things in such a function if we change the mod the target directory to the mod we specified. Does anybody feel such behavior maybe dangerous? Because if the function success, we know nothing about weather we create a new directory or we convert an existing directory to the directory we need.
msg111680 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-07-27 02:55
What does mkdir -p do, which would at least be a starting point?
msg111681 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-27 03:36
I want to explain "mkdir -p" as this:

We want to create a specified directory, if such a directory doesn't exist, then create it. If such a directory already exists, then we have already reached our goal, do nothing.

While we port this function to os.makedir(), there is a more specified information of the target directory, the "mode". If the target directory already exists but with a different mode, we need not create it, but we haven't reach our goal, yet. So we can raise a exception.
msg111702 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-07-27 15:48
If I understand, this makes the change minimal: exist_ok means that if *name* already exists as a directory with the specified permissions, then do not raise an error. OK with me. Make sure doc and doc string say something like that.
msg111703 - (view) Author: Alexander Belopolsky (belopolsky) * (Python committer) Date: 2010-07-27 16:02
> if *name* already exists as a directory with the specified
> permissions, then do not raise an error.

AFAICT, the code in the patch does not check permissions of the existing path(s) or even whether it is a directory or not.
msg111704 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-07-27 16:08
Yes, Arfrever brought that up and the question now is whether and how to revise it.
msg111705 - (view) Author: Arfrever Frehtes Taifersar Arahesis (Arfrever) * Date: 2010-07-27 16:11
'mkdir -p' prints error when target exists and is non-directory:

$ cd /tmp 
$ touch file
$ mkdir -p file
mkdir: cannot create directory `file': File exists
msg111772 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-28 06:52
I updated the patch. Now the patch:

suppress the OSError if and only if the target directory with the same mode as we specified already exists.
msg111796 - (view) Author: Arfrever Frehtes Taifersar Arahesis (Arfrever) * Date: 2010-07-28 12:30
You haven't attached the new patch.
msg111798 - (view) Author: ysj.ray (ysj.ray) Date: 2010-07-28 12:42
Oh, sorry, here is the patch.
msg112485 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2010-08-02 14:59
Doc review: Small typo, Flase vs False.  Also, exceptions are "raised" rather than "thrown" in Python land (same for the docstring).  Both exception references should be :exc:`OSError`.

Otherwise, looks fine to me.

Raising priority; this should go into 3.2.
msg112584 - (view) Author: ysj.ray (ysj.ray) Date: 2010-08-03 11:56
> Doc review: Small typo, Flase vs False.  Also, exceptions are "raised" rather than "thrown" in Python land (same for the docstring).  Both exception references should be :exc:`OSError`.

Here fixed these doc problems. Thanks for reviewing! Besides, the reason why I use "throw" rather than "raise" is that I found current Doc use "throw an exception", so I think an exception is "thrown". ^_^
msg112585 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2010-08-03 12:04
Thanks for bringing that up, I've now fixed all these instances of "throw" that should be "raise".
msg113156 - (view) Author: ysj.ray (ysj.ray) Date: 2010-08-07 08:56
Since the patch cannot be applied to py3k cleanly, I update it.
msg122596 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2010-11-28 01:40
Patch still applies without errors.  Georg, since you reviewed the patch and approved it for 3.2, I’m marking as pending and assigning to you.  Tell me if I shouldn’t have.
msg122601 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-11-28 02:17
Patch is missing version-added directive and News entry. I will try to add these and re-upload for final check.
msg122616 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-11-28 03:43
I applied mkdir.diff, 08-07, patch to my current working copy, added version-added and News entry (with credit to Ray Allen) and added Ray Allen to ACKS. Uploaded as mkdirs.tr.diff

I suspect a complete test should include a linux system, but I copied os.py and test_os.py to my WinXP 3.2a3 installation and in IDLE ran
>>> from test.test_os import test_main as f; f()

The mkdir tests passed, but for what is is worth, 3 others did not:
(I have no interpretation or comment on these ;-)
======================================================================
ERROR: test_CTRL_BREAK_EVENT (test.test_os.Win32KillTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Programs\Python32\lib\test\test_os.py", line 1137, in test_CTRL_BREAK_EVENT
    self._kill_with_event(signal.CTRL_BREAK_EVENT, "CTRL_BREAK_EVENT")
  File "C:\Programs\Python32\lib\test\test_os.py", line 1111, in _kill_with_event
    time.sleep(0.5)
WindowsError: [Error 6] The handle is invalid

======================================================================
ERROR: test_link (test.test_os.LinkTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Programs\Python32\lib\test\test_os.py", line 906, in test_link
    self._test_link(self.file1, self.file2)
  File "C:\Programs\Python32\lib\test\test_os.py", line 901, in _test_link
    os.link(file1, file2)
AttributeError: 'module' object has no attribute 'link'

======================================================================
ERROR: test_link_bytes (test.test_os.LinkTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Programs\Python32\lib\test\test_os.py", line 910, in test_link_bytes
    bytes(self.file2, sys.getfilesystemencoding()))
  File "C:\Programs\Python32\lib\test\test_os.py", line 901, in _test_link
    os.link(file1, file2)
AttributeError: 'module' object has no attribute 'link'
msg122622 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2010-11-28 04:12
All tests pass on my Debian.

(I suggest removing the unnecessary backslash before committing.)
msg122638 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-11-28 06:37
\ at end of os.py addition
msg122649 - (view) Author: ysj.ray (ysj.ray) Date: 2010-11-28 10:59
Thanks for Terry's addition to the patch! 

On my python3.2a3 on windows(also copied os.py and test_os.py to the installation), I only get the tow "os.link" errors. And this is because the python3.2a3 hasn't the "os.link" function, and the test.LinkTests in test_os.py is added later after python3.2a3, at r86733.

I don't know Why is there a WindowsError in time.sleep(), but I cannot reproduce this Error.
msg122700 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-11-28 18:51
Afaik, those error have nothing to do with this issue. I just included them for completeness in case they were helpful to GB.
msg123060 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-12-02 07:08
I removed trailing '\' and whitespace, refreshed against current repository, removing conflicts, and committed. r86930
msg123083 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-12-02 17:32
Georg Brandl patched the doc changes in r86931.
Ray, for future reference, you might take a look, particularly 

-.. function:: makedirs(path[, mode][, exist_ok=False])
+.. function:: makedirs(path, mode=0o777, exist_ok=False)

In 3.x, (as opposed to 2.x), the style for params with default args is to give the default if possible, *without* [] now, so the signature in the doc looks as in a def statement. I, of course, missed this.
msg123086 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2010-12-02 17:37
Well, you're not to blame since the patch merely extended the definition which was still using obsolete syntax anyway.
msg123162 - (view) Author: ysj.ray (ysj.ray) Date: 2010-12-03 02:26
Oh, yes, I missed that, too. I didn't pay attention to that. Thanks for  pointing out it and fix it!
msg215084 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2014-03-28 22:27
For anyone watching this still, the fix introduced in this issue caused a security vulnerability, see http://bugs.python.org/issue21082 .
History
Date User Action Args
2014-03-28 22:27:31gvanrossumsetnosy: + gvanrossum
messages: + msg215084
2010-12-03 02:26:38ysj.raysetmessages: + msg123162
2010-12-02 17:37:17georg.brandlsetmessages: + msg123086
2010-12-02 17:32:00terry.reedysetmessages: + msg123083
2010-12-02 07:08:10terry.reedysetstatus: open -> closed
assignee: georg.brandl -> terry.reedy
resolution: accepted -> fixed
messages: + msg123060
2010-11-28 18:51:17terry.reedysetmessages: + msg122700
2010-11-28 10:59:11ysj.raysetmessages: + msg122649
2010-11-28 06:37:10terry.reedysetmessages: + msg122638
2010-11-28 04:12:32eric.araujosetmessages: + msg122622
2010-11-28 03:43:51terry.reedysetfiles: + mkdirs.tr.diff

messages: + msg122616
2010-11-28 02:17:45terry.reedysetstatus: pending -> open

messages: + msg122601
2010-11-28 01:40:43eric.araujosetstatus: open -> pending
assignee: georg.brandl
messages: + msg122596
2010-08-07 08:56:12ysj.raysetfiles: + mkdir.diff

messages: + msg113156
2010-08-03 12:04:10georg.brandlsetmessages: + msg112585
2010-08-03 11:56:17ysj.raysetfiles: + mkdir.diff

messages: + msg112584
2010-08-02 14:59:29georg.brandlsetpriority: normal -> critical
nosy: + georg.brandl
messages: + msg112485

2010-07-28 12:42:25ysj.raysetfiles: + mkdir.diff

messages: + msg111798
2010-07-28 12:30:24Arfreversetmessages: + msg111796
2010-07-28 06:52:53ysj.raysetmessages: + msg111772
2010-07-27 16:11:13Arfreversetmessages: + msg111705
2010-07-27 16:08:32terry.reedysetmessages: + msg111704
2010-07-27 16:02:44belopolskysetnosy: + belopolsky
messages: + msg111703
2010-07-27 15:48:02terry.reedysetmessages: + msg111702
2010-07-27 03:56:41gvanrossumsetnosy: - gvanrossum
2010-07-27 03:36:45ysj.raysetmessages: + msg111681
2010-07-27 02:55:21terry.reedysetmessages: + msg111680
2010-07-27 02:20:03ysj.raysetmessages: + msg111679
2010-07-26 13:32:25Arfreversetmessages: + msg111612
2010-07-26 13:26:13ysj.raysetmessages: + msg111609
2010-07-25 01:27:52terry.reedysetmessages: + msg111517
stage: patch review -> commit review
2010-07-25 00:19:09Arfreversettitle: os.mkdir() and os.makedirs() add a keyword argument to suppress "File exists" exception. -> os.makedirs(): Add a keyword argument to suppress "File exists" exception
2010-07-25 00:15:25Arfreversetmessages: + msg111514
2010-07-22 05:34:38ysj.raysetfiles: + mkdir_py3k.diff

messages: + msg111150
2010-07-21 21:04:38terry.reedysetmessages: + msg111120
2010-07-21 08:00:41ysj.raysetmessages: + msg111018
2010-07-21 07:08:49gvanrossumsetmessages: + msg111014
2010-07-21 06:41:31terry.reedysetmessages: + msg111011
2010-07-21 04:23:43ysj.raysetfiles: + mkdir_py3k_updated.diff

messages: + msg111005
2010-07-21 03:04:58ysj.raysetmessages: + msg110995
2010-07-21 02:32:11terry.reedysetmessages: + msg110991
2010-07-21 02:13:26terry.reedylinkissue1675 superseder
2010-07-20 03:14:19ysj.raysetfiles: + mkdir_py3k_updated.diff

messages: + msg110855
2010-07-19 20:27:08Arfreversetnosy: + Arfrever
2010-07-19 17:51:29eric.araujosetnosy: + eric.araujo
2010-07-19 16:10:21terry.reedysetnosy: + gvanrossum, zooko, ggenellina, draghuram
2010-07-19 16:03:13terry.reedysettype: enhancement
versions: + Python 3.2, - Python 2.7, Python 3.3
nosy: + terry.reedy

messages: + msg110770
resolution: accepted
stage: patch review
2010-07-19 13:58:50ysj.raysetmessages: + msg110757
2010-07-19 13:43:30ijmorlansetmessages: + msg110753
2010-07-19 13:39:49ijmorlansetnosy: + ijmorlan
messages: + msg110750
2010-07-19 08:57:43ysj.raysetfiles: + mkdir_py3k.diff

messages: + msg110721
2010-07-19 08:55:58ysj.raysetfiles: - mkdir_py3k.diff
2010-07-19 08:50:25giampaolo.rodolasetmessages: + msg110720
2010-07-19 08:49:25giampaolo.rodolasetnosy: + giampaolo.rodola
2010-07-19 08:47:34ysj.raycreate