"""Common utility functions
"""
-import errno, os, os.path, sys
+import errno, os, os.path, re, sys
from stgit.config import config
__copyright__ = """
assert string.endswith(suffix)
return string[:-len(suffix)]
-def remove_dirs(basedir, dirs):
- """Starting at join(basedir, dirs), remove the directory if empty,
- and try the same with its parent, until we find a nonempty
- directory or reach basedir."""
- path = dirs
- while path:
- try:
- os.rmdir(os.path.join(basedir, path))
- except OSError:
- return # can't remove nonempty directory
- path = os.path.dirname(path)
-
def remove_file_and_dirs(basedir, file):
"""Remove join(basedir, file), and then remove the directory it
was in if empty, and try the same with its parent, until we find a
nonempty directory or reach basedir."""
os.remove(os.path.join(basedir, file))
- remove_dirs(basedir, os.path.dirname(file))
+ try:
+ os.removedirs(os.path.join(basedir, os.path.dirname(file)))
+ except OSError:
+ # file's parent dir may not be empty after removal
+ pass
def create_dirs(directory):
"""Create the given directory, if the path doesn't already exist."""
full_file2 = os.path.join(basedir, file2)
create_dirs(os.path.dirname(full_file2))
os.rename(os.path.join(basedir, file1), full_file2)
- remove_dirs(basedir, os.path.dirname(file1))
+ try:
+ os.removedirs(os.path.join(basedir, os.path.dirname(file1)))
+ except OSError:
+ # file1's parent dir may not be empty after move
+ pass
+
+class EditorException(Exception):
+ pass
def call_editor(filename):
"""Run the editor on the specified filename."""
sys.stdout.flush()
err = os.system(editor)
if err:
- raise Exception, 'editor failed, exit code: %d' % err
+ raise EditorException, 'editor failed, exit code: %d' % err
print 'done'
+
+def patch_name_from_msg(msg):
+ """Return a string to be used as a patch name. This is generated
+ from the top line of the string passed as argument, and is at most
+ 30 characters long."""
+ if not msg:
+ return None
+
+ subject_line = msg.split('\n', 1)[0].lstrip().lower()
+ return re.sub('[\W]+', '-', subject_line).strip('-')[:30]
+
+def make_patch_name(msg, unacceptable, default_name = 'patch'):
+ """Return a patch name generated from the given commit message,
+ guaranteed to make unacceptable(name) be false. If the commit
+ message is empty, base the name on default_name instead."""
+ patchname = patch_name_from_msg(msg)
+ if not patchname:
+ patchname = default_name
+ if unacceptable(patchname):
+ suffix = 0
+ while unacceptable('%s-%d' % (patchname, suffix)):
+ suffix += 1
+ patchname = '%s-%d' % (patchname, suffix)
+ return patchname