git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [STGIT][PATCH] new: translate non word characters in patch name to '-'

From
Hannes Eder <hannes@hanneseder.net>
Date
Dec 29, 2008, 20:15 UTC
Message-ID
<154e089b0812291215h72dfe04aod080f665eb7f5592@mail.gmail.com>
In-Reply-To
<20081228204938.GA13143@diana.vm.bytemark.co.uk>
On 12/28/08, Karl Hasselström <kha@treskal.com> wrote:
Show 33 quoted lines
> On 2008-12-27 13:37:20 +0100, Hannes Eder wrote:
>
>  > This allows following usage:
>  >
>  > $ stg new full/path/file-fix-foobar
>  > Now at patch "full-path-file-fix-foobar"
>  >
>  > Signed-off-by: Hannes Eder <hannes@hanneseder.net>
>  > ---
>  >
>  > I ran into as a '/' in a patch messed up stgit.
>  >
>  > I find this useful as 'stg uncommit' does the same translation.
>
>
> Clearly, bad path names shouldn't mess anything up -- see
>
>   https://gna.org/bugs/?10919
>
>  But I would prefer "stg new" to quit with an error message when given
>  an illegal patch name, not silently mangle it. (Of course, the
>  commands that generate patch names from commit messages -- such as
>  "stg new" when not given an explicit patch name -- should mangle the
>  commit message as much as necessary. But when the user gives us a
>  patch name, we should either use that as is or fail with an
>  informative message.)
>
>  I think the right thing to do would be to construct a function that
>  validates patch names (I don't think we have one right now), and then
>  call it whenever we need to check if a patch name is OK. Such as when
>  the user gives us the name of a new patch. And when we've
>  auto-generated a patch name from a commit message, we should probably
>  assert that that the check function is OK with the name.

What about instead of 'fail with an informative message', just issue a warning that the name has been mangled. I use pathnames in patch names frequently, so this would be very handy. I guess some with with more python skills needs to clean that up, this is the first stuff I do in python ;).

---
diff --git a/stgit/commands/new.py b/stgit/commands/new.py
index 151cfe9..ed5c9ce 100644
--- a/stgit/commands/new.py
+++ b/stgit/commands/new.py
@@ -58,7 +58,7 @@ def func(parser, options, args):
     if len(args) == 0:
         name = None
     elif len(args) == 1:
-        name = args[0]
+        name = utils.sanitize_patch_name(args[0])
         if stack.patches.exists(name):
             raise common.CmdException('%s: patch already exists' % name)
     else:
diff --git a/stgit/commands/rename.py b/stgit/commands/rename.py
index 8a593ac..455b67e 100644
--- a/stgit/commands/rename.py
+++ b/stgit/commands/rename.py
@@ -50,6 +50,8 @@ def func(parser, options, args):
         old, [new] = crt, args
     else:
         parser.error('incorrect number of arguments')
+
+    new = utils.sanitize_patch_name(new)

     out.start('Renaming patch "%s" to "%s"' % (old, new))
     crt_series.rename_patch(old, new)
diff --git a/stgit/utils.py b/stgit/utils.py
index 81035a5..8ffe5a3 100644
--- a/stgit/utils.py
+++ b/stgit/utils.py
@@ -231,6 +231,31 @@ def make_patch_name(msg, unacceptable,
default_name = 'patch'):
         patchname = default_name
     return find_patch_name(patchname, unacceptable)

+class PatchNameException(StgException):
+    pass
+
+def sanitize_patch_name(patchname):
+    # '..' is for patch ranges only, so it is not allowed here
+    if patchname.find('..') != -1:
+         raise PatchNameException('Patch name must not contain "..".')
+
+    # if patch name contains non word characters, replace them but warn user
+    # about that
+    if re.search('\W', patchname):
+        out.warn('replacing non word characters in patch name');
+        patchname = re.sub('[\W]+', '-', patchname).strip('-')
+
+    # limit patch name length
+    name_len = config.get('stgit.namelength')
+    if not name_len:
+        name_len = 30
+
+    if len(patchname) > name_len:
+        out.warn('truncating the patch name to %d characters' % name_len)
+        patchname = patchname[:name_len]
+
+    return patchname
+
 # any and all functions are builtin in Python 2.5 and higher, but not
 # in 2.4.
 if not 'any' in dir(__builtins__):
Previous: Karl HasselströmNext: Karl Hasselström
Message 3 of 7 in “new: translate non word characters in patch name to '-'”
  1. Hannes EderDec 27, 2008
  2. Karl HasselströmDec 28, 2008
  3. Hannes EderDec 29, 2008
  4. Karl HasselströmDec 29, 2008
  5. Hannes EderDec 31, 2008
  6. Karl HasselströmDec 31, 2008
  7. David KågedalJan 15, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.