format: Handle empty subject-prefix

Josh Triplett created

Don't write "[] " with an empty subject-prefix, but do write [v2] or
[M/N] if needed.

Change summary

src/main.rs | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)

Detailed changes

src/main.rs 🔗

@@ -1069,6 +1069,14 @@ fn mail_signature() -> String {
     format!("-- \ngit-series {}", crate_version!())
 }
 
+fn ensure_space(s: &str) -> &'static str {
+    if s.is_empty() || s.ends_with(' ') {
+        ""
+    } else {
+        " "
+    }
+}
+
 fn ensure_nl(s: &str) -> &'static str {
     if !s.ends_with('\n') {
         "\n"
@@ -1119,7 +1127,9 @@ fn format(out: &mut Output, repo: &Repository, m: &ArgMatches) -> Result<()> {
 
     let version = m.value_of("reroll-count");
     let subject_prefix = m.value_of("subject-prefix").unwrap_or("PATCH");
-    let subject_patch = version.map_or(subject_prefix.to_string(), |n| format!("{} v{}", subject_prefix, n));
+    let subject_patch = version.map_or(
+            subject_prefix.to_string(),
+            |n| format!("{}{}v{}", subject_prefix, ensure_space(&subject_prefix), n));
     let file_prefix = version.map_or("".to_string(), |n| format!("v{}-", n));
 
     let signature = mail_signature();
@@ -1159,7 +1169,7 @@ fn format(out: &mut Output, repo: &Repository, m: &ArgMatches) -> Result<()> {
         in_reply_to_message_id = Some(cover_message_id);
         try!(writeln!(out, "From: {} <{}>", committer_name, committer_email));
         try!(writeln!(out, "Date: {}", date_822(committer.when())));
-        try!(writeln!(out, "Subject: [{} 0/{}] {}\n", subject_patch, commits.len(), subject));
+        try!(writeln!(out, "Subject: [{}{}0/{}] {}\n", subject_patch, ensure_space(&subject_patch), commits.len(), subject));
         if !body.is_empty() {
             try!(writeln!(out, "{}", body));
         }
@@ -1205,12 +1215,16 @@ fn format(out: &mut Output, repo: &Repository, m: &ArgMatches) -> Result<()> {
             try!(writeln!(out, "From: {} <{}>", committer_name, committer_email));
         }
         try!(writeln!(out, "Date: {}", date_822(commit_author.when())));
-        let m_of_n = if commits.len() == 1 && cover_entry.is_none() {
-            "".to_string()
+        let prefix = if commits.len() == 1 && cover_entry.is_none() {
+            if subject_patch.is_empty() {
+                "".to_string()
+            } else {
+                format!("[{}] ", subject_patch)
+            }
         } else {
-            format!(" {}/{}", commit_num+1, commits.len())
+            format!("[{}{}{}/{}] ", subject_patch, ensure_space(&subject_patch), commit_num+1, commits.len())
         };
-        try!(writeln!(out, "Subject: [{}{}] {}\n", subject_patch, m_of_n, subject));
+        try!(writeln!(out, "Subject: {}{}\n", prefix, subject));
 
         if !no_from && (commit_author_name != committer_name || commit_author_email != committer_email) {
             try!(writeln!(out, "From: {} <{}>\n", commit_author_name, commit_author_email));