pub struct CommitMessage<'a> { /* private fields */ }
Expand description

A CommitMessage, the primary entry point to the library

Implementations§

source§

impl<'a> CommitMessage<'a>

source

pub fn from_fragments( fragments: Vec<Fragment<'_>>, scissors: Option<Scissors<'_>> ) -> Self

Convert from Fragment back into a full CommitMessage

Get back to a CommitMessage from an ast, usually after you’ve been editing the text.

Examples
use indoc::indoc;
use mit_commit::{Bodies, CommitMessage, Subject};

let message = CommitMessage::from(indoc!(
    "
    Update bashrc to include kubernetes completions

    This should make it easier to deploy things for the developers.
    Benchmarked with Hyperfine, no noticable performance decrease.

    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Datum:            Sat Jun 27 21:40:14 2020 +0200
    ;
    ; Auf Branch master
    ;
    ; Initialer Commit
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;    neue Datei:     .bashrc
    ;"
));
assert_eq!(
    CommitMessage::from_fragments(message.get_ast(), message.get_scissors()),
    message,
)
source

pub fn add_trailer(&self, trailer: Trailer<'_>) -> Self

A helper method to let you insert Trailer

Examples
use indoc::indoc;
use mit_commit::{CommitMessage, Trailer};
let commit = CommitMessage::from(indoc!(
    "
    Example Commit Message

    This is an example commit message for linting

    Relates-to: #153

    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Auf Branch main
    ; Ihr Branch ist auf demselben Stand wie 'origin/main'.
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;    neue Datei:     file
    ;
    "
));

assert_eq!(
    String::from(commit.add_trailer(Trailer::new(
        "Co-authored-by".into(),
        "Test Trailer <test@example.com>".into()
    ))),
    String::from(CommitMessage::from(indoc!(
        "
        Example Commit Message

        This is an example commit message for linting

        Relates-to: #153
        Co-authored-by: Test Trailer <test@example.com>

        ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
        ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
        ; bricht den Commit ab.
        ;
        ; Auf Branch main
        ; Ihr Branch ist auf demselben Stand wie 'origin/main'.
        ;
        ; Zum Commit vorgemerkte \u{00E4}nderungen:
        ;    neue Datei:     file
        ;
        "
    )))
);
source

pub fn insert_after_last_full_body(&self, fragment: Vec<Fragment<'_>>) -> Self

Insert text in the place you’re most likely to want it

In the case you don’t have any full Body in there, it inserts it at the top of the commit, in the Subject line.

Examples
use mit_commit::{Fragment, Body, CommitMessage, Comment};

        let ast: Vec<Fragment> = vec![
            Fragment::Body(Body::from("Add file")),
            Fragment::Body(Body::default()),
            Fragment::Body(Body::from("Looks-like-a-trailer: But isn\'t")),
            Fragment::Body(Body::default()),
            Fragment::Body(Body::from("This adds file primarily for demonstration purposes. It might not be\nuseful as an actual commit, but it\'s very useful as a example to use in\ntests.")),
            Fragment::Body(Body::default()),
            Fragment::Body(Body::from("Relates-to: #128")),
            Fragment::Body(Body::default()),
            Fragment::Comment(Comment::from("# Short (50 chars or less) summary of changes\n#\n# More detailed explanatory text, if necessary.  Wrap it to\n# about 72 characters or so.  In some contexts, the first\n# line is treated as the subject of an email and the rest of\n# the text as the body.  The blank line separating the\n# summary from the body is critical (unless you omit the body\n# entirely); tools like rebase can get confused if you run\n# the two together.\n#\n# Further paragraphs come after blank lines.\n#\n#   - Bullet points are okay, too\n#\n#   - Typically a hyphen or asterisk is used for the bullet,\n#     preceded by a single space, with blank lines in\n#     between, but conventions vary here")),
            Fragment::Body(Body::default()),
            Fragment::Comment(Comment::from("# Bitte geben Sie eine Commit-Beschreibung f\u{fc}r Ihre \u{e4}nderungen ein. Zeilen,\n# die mit \'#\' beginnen, werden ignoriert, und eine leere Beschreibung\n# bricht den Commit ab.\n#\n# Auf Branch main\n# Ihr Branch ist auf demselben Stand wie \'origin/main\'.\n#\n# Zum Commit vorgemerkte \u{e4}nderungen:\n#\tneue Datei:     file\n#"))
        ];
        let commit = CommitMessage::from_fragments(ast, None);

        assert_eq!(commit.insert_after_last_full_body(vec![Fragment::Body(Body::from("Relates-to: #656"))]).get_ast(), vec![
            Fragment::Body(Body::from("Add file")),
            Fragment::Body(Body::default()),
            Fragment::Body(Body::from("Looks-like-a-trailer: But isn\'t")),
            Fragment::Body(Body::default()),
            Fragment::Body(Body::from("This adds file primarily for demonstration purposes. It might not be\nuseful as an actual commit, but it\'s very useful as a example to use in\ntests.")),
            Fragment::Body(Body::default()),
            Fragment::Body(Body::from("Relates-to: #128\nRelates-to: #656")),
            Fragment::Body(Body::default()),
            Fragment::Comment(Comment::from("# Short (50 chars or less) summary of changes\n#\n# More detailed explanatory text, if necessary.  Wrap it to\n# about 72 characters or so.  In some contexts, the first\n# line is treated as the subject of an email and the rest of\n# the text as the body.  The blank line separating the\n# summary from the body is critical (unless you omit the body\n# entirely); tools like rebase can get confused if you run\n# the two together.\n#\n# Further paragraphs come after blank lines.\n#\n#   - Bullet points are okay, too\n#\n#   - Typically a hyphen or asterisk is used for the bullet,\n#     preceded by a single space, with blank lines in\n#     between, but conventions vary here")),
            Fragment::Body(Body::default()),
            Fragment::Comment(Comment::from("# Bitte geben Sie eine Commit-Beschreibung f\u{fc}r Ihre \u{e4}nderungen ein. Zeilen,\n# die mit \'#\' beginnen, werden ignoriert, und eine leere Beschreibung\n# bricht den Commit ab.\n#\n# Auf Branch main\n# Ihr Branch ist auf demselben Stand wie \'origin/main\'.\n#\n# Zum Commit vorgemerkte \u{e4}nderungen:\n#\tneue Datei:     file\n#"))
        ])
source

pub fn get_subject(&self) -> Subject<'a>

Get the Subject line from the CommitMessage

It’s possible to get this from the ast, but it’s a bit of a faff, so this is a convenience method

Examples
use indoc::indoc;
use mit_commit::{Bodies, CommitMessage, Subject};

let message = CommitMessage::from(indoc!(
    "
    Update bashrc to include kubernetes completions

    This should make it easier to deploy things for the developers.
    Benchmarked with Hyperfine, no noticable performance decrease.

    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Datum:            Sat Jun 27 21:40:14 2020 +0200
    ;
    ; Auf Branch master
    ;
    ; Initialer Commit
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;    neue Datei:     .bashrc
    ;"
));
assert_eq!(
    message.get_subject(),
    Subject::from("Update bashrc to include kubernetes completions")
)
source

pub fn get_ast(&self) -> Vec<Fragment<'_>>

Get the underlying data structure that represents the CommitMessage

This is the underlying datastructure for the CommitMessage. You might want this to create a complicated linter, or modify the CommitMessage to your liking.

Notice how it doesn’t include the Scissors section.

Examples
use indoc::indoc;
use mit_commit::{Body, CommitMessage, Fragment, Trailer, Trailers, Comment};

let message = CommitMessage::from(indoc!(
    "
    Add file

    Looks-like-a-trailer: But isn't

    This adds file primarily for demonstration purposes. It might not be
    useful as an actual commit, but it's very useful as a example to use in
    tests.

    Relates-to: #128
    Relates-to: #129

    ; Short (50 chars or less) summary of changes
    ;
    ; More detailed explanatory text, if necessary.  Wrap it to
    ; about 72 characters or so.  In some contexts, the first
    ; line is treated as the subject of an email and the rest of
    ; the text as the body.  The blank line separating the
    ; summary from the body is critical (unless you omit the body
    ; entirely); tools like rebase can get confused if you run
    ; the two together.
    ;
    ; Further paragraphs come after blank lines.
    ;
    ;   - Bullet points are okay, too
    ;
    ;   - Typically a hyphen or asterisk is used for the bullet,
    ;     preceded by a single space, with blank lines in
    ;     between, but conventions vary here

    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Auf Branch main
    ; Ihr Branch ist auf demselben Stand wie 'origin/main'.
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;   neue Datei:     file
    ;
    ; ------------------------ >8 ------------------------
    ; \u{00E4}ndern oder entfernen Sie nicht die obige Zeile.
    ; Alles unterhalb von ihr wird ignoriert.
    diff --git a/file b/file
    new file mode 100644
    index 0000000..e69de29
    "
));
let ast = vec![
    Fragment::Body(Body::from("Add file")),
    Fragment::Body(Body::default()),
    Fragment::Body(Body::from("Looks-like-a-trailer: But isn't")),
    Fragment::Body(Body::default()),
    Fragment::Body(Body::from("This adds file primarily for demonstration purposes. It might not be\nuseful as an actual commit, but it\'s very useful as a example to use in\ntests.")),
    Fragment::Body(Body::default()),
    Fragment::Body(Body::from("Relates-to: #128\nRelates-to: #129")),
    Fragment::Body(Body::default()),
    Fragment::Comment(Comment::from("; Short (50 chars or less) summary of changes\n;\n; More detailed explanatory text, if necessary.  Wrap it to\n; about 72 characters or so.  In some contexts, the first\n; line is treated as the subject of an email and the rest of\n; the text as the body.  The blank line separating the\n; summary from the body is critical (unless you omit the body\n; entirely); tools like rebase can get confused if you run\n; the two together.\n;\n; Further paragraphs come after blank lines.\n;\n;   - Bullet points are okay, too\n;\n;   - Typically a hyphen or asterisk is used for the bullet,\n;     preceded by a single space, with blank lines in\n;     between, but conventions vary here")),
    Fragment::Body(Body::default()),
    Fragment::Comment(Comment::from("; Bitte geben Sie eine Commit-Beschreibung für Ihre änderungen ein. Zeilen,\n; die mit \';\' beginnen, werden ignoriert, und eine leere Beschreibung\n; bricht den Commit ab.\n;\n; Auf Branch main\n; Ihr Branch ist auf demselben Stand wie \'origin/main\'.\n;\n; Zum Commit vorgemerkte änderungen:\n;   neue Datei:     file\n;"))
];
assert_eq!(message.get_ast(), ast)
source

pub fn get_body(&self) -> Bodies<'_>

Get the Bodies from the CommitMessage

This gets the Bodies from the CommitMessage in easy to use paragraphs, we add in blank bodies because starting a new paragraph is a visual delimiter so we want to make that easy to detect.

It doesn’t include the Subject line, but if there’s a blank line after it (as is recommended by the manual), the Bodies will start with a new empty Body.

Examples
use indoc::indoc;
use mit_commit::{Bodies, Body, CommitMessage, Subject};

let message = CommitMessage::from(indoc!(
    "
    Update bashrc to include kubernetes completions

    This should make it easier to deploy things for the developers.
    Benchmarked with Hyperfine, no noticable performance decrease.

    I am unsure as to why this wasn't being automatically discovered from Brew.
    I've filed a bug report with them.

    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Datum:            Sat Jun 27 21:40:14 2020 +0200
    ;
    ; Auf Branch master
    ;
    ; Initialer Commit
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;    neue Datei:     .bashrc
    ;"
));
let bodies = vec![
    Body::default(),
    Body::from(indoc!(
        "
        This should make it easier to deploy things for the developers.
        Benchmarked with Hyperfine, no noticable performance decrease."
    )),
    Body::default(),
    Body::from(indoc!(
        "
        I am unsure as to why this wasn't being automatically discovered from Brew.
        I've filed a bug report with them."
    )),
];
assert_eq!(message.get_body(), Bodies::from(bodies))
source

pub fn get_comments(&self) -> Comments<'_>

Get the Comments from the CommitMessage

We this will get you all the comments before the Scissors section. The Scissors section is the bit that appears when you run git commit --verbose, that contains the diffs.

If there’s Comment mixed in with the body, it’ll return those too, but not any of the Body around them.

Examples
use indoc::indoc;
use mit_commit::{Body, Comment, Comments, CommitMessage, Subject};

let message = CommitMessage::from(indoc!(
    "
    Update bashrc to include kubernetes completions

    This should make it easier to deploy things for the developers.
    Benchmarked with Hyperfine, no noticable performance decrease.

    I am unsure as to why this wasn't being automatically discovered from Brew.
    I've filed a bug report with them.

    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Datum:            Sat Jun 27 21:40:14 2020 +0200
    ;
    ; Auf Branch master
    ;
    ; Initialer Commit
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;    neue Datei:     .bashrc
    ;"
));
let comments = vec![Comment::from(indoc!(
    "
    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Datum:            Sat Jun 27 21:40:14 2020 +0200
    ;
    ; Auf Branch master
    ;
    ; Initialer Commit
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;    neue Datei:     .bashrc
    ;"
))];
assert_eq!(message.get_comments(), Comments::from(comments))
source

pub fn get_scissors(&self) -> Option<Scissors<'_>>

Get the Scissors from the CommitMessage

We this will get you all the comments in the Scissors section. The Scissors section is the bit that appears when you run git commit --verbose, that contains the diffs, and is not preserved when you save the commit.

Examples
use indoc::indoc;
use mit_commit::{Body, CommitMessage, Scissors, Subject};

let message = CommitMessage::from(indoc!(
    "
    Add file

    This adds file primarily for demonstration purposes. It might not be
    useful as an actual commit, but it's very useful as a example to use in
    tests.

    Relates-to: #128

    ; Short (50 chars or less) summary of changes
    ;
    ; More detailed explanatory text, if necessary.  Wrap it to
    ; about 72 characters or so.  In some contexts, the first
    ; line is treated as the subject of an email and the rest of
    ; the text as the body.  The blank line separating the
    ; summary from the body is critical (unless you omit the body
    ; entirely); tools like rebase can get confused if you run
    ; the two together.
    ;
    ; Further paragraphs come after blank lines.
    ;
    ;   - Bullet points are okay, too
    ;
    ;   - Typically a hyphen or asterisk is used for the bullet,
    ;     preceded by a single space, with blank lines in
    ;     between, but conventions vary here

    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Auf Branch main
    ; Ihr Branch ist auf demselben Stand wie 'origin/main'.
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;   neue Datei:     file
    ;
    ; ------------------------ >8 ------------------------
    ; \u{00E4}ndern oder entfernen Sie nicht die obige Zeile.
    ; Alles unterhalb von ihr wird ignoriert.
    diff --git a/file b/file
    new file mode 100644
    index 0000000..e69de29
    "
));
let scissors = Scissors::from(indoc!(
    "
    ; ------------------------ >8 ------------------------
    ; \u{00E4}ndern oder entfernen Sie nicht die obige Zeile.
    ; Alles unterhalb von ihr wird ignoriert.
    diff --git a/file b/file
    new file mode 100644
    index 0000000..e69de29
    "
));
assert_eq!(message.get_scissors(), Some(scissors))
source

pub fn get_trailers(&self) -> Trailers<'_>

Get the Scissors from the CommitMessage

We this will get you all the comments in the Scissors section. The Scissors section is the bit that appears when you run git commit --verbose, that contains the diffs, and is not preserved when you save the commit.

Examples
use indoc::indoc;
use mit_commit::{Body, CommitMessage, Trailer, Trailers};

let message = CommitMessage::from(indoc!(
    "
    Add file

    Looks-like-a-trailer: But isn't

    This adds file primarily for demonstration purposes. It might not be
    useful as an actual commit, but it's very useful as a example to use in
    tests.

    Relates-to: #128
    Relates-to: #129

    ; Short (50 chars or less) summary of changes
    ;
    ; More detailed explanatory text, if necessary.  Wrap it to
    ; about 72 characters or so.  In some contexts, the first
    ; line is treated as the subject of an email and the rest of
    ; the text as the body.  The blank line separating the
    ; summary from the body is critical (unless you omit the body
    ; entirely); tools like rebase can get confused if you run
    ; the two together.
    ;
    ; Further paragraphs come after blank lines.
    ;
    ;   - Bullet points are okay, too
    ;
    ;   - Typically a hyphen or asterisk is used for the bullet,
    ;     preceded by a single space, with blank lines in
    ;     between, but conventions vary here

    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Auf Branch main
    ; Ihr Branch ist auf demselben Stand wie 'origin/main'.
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;   neue Datei:     file
    ;
    ; ------------------------ >8 ------------------------
    ; \u{00E4}ndern oder entfernen Sie nicht die obige Zeile.
    ; Alles unterhalb von ihr wird ignoriert.
    diff --git a/file b/file
    new file mode 100644
    index 0000000..e69de29
    "
));
let trailers = vec![
    Trailer::new("Relates-to".into(), "#128".into()),
    Trailer::new("Relates-to".into(), "#129".into()),
];
assert_eq!(message.get_trailers(), Trailers::from(trailers))
source

pub fn matches_pattern(&self, re: &Regex) -> bool

Does the CommitMessage the saved portions of the commit

This takes a regex and matches it to the visible portions of the commits, so it excludes comments, and everything after the scissors.

Examples
use indoc::indoc;
use mit_commit::CommitMessage;
use regex::Regex;

let commit = CommitMessage::from(indoc!(
    "
    Example Commit Message

    This is an example commit message for linting


    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Auf Branch main
    ; Ihr Branch ist auf demselben Stand wie 'origin/main'.
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;    neue Datei:     file
    ;
    "
));

let re = Regex::new("[Bb]itte").unwrap();
assert_eq!(commit.matches_pattern(&re), false);

let re = Regex::new("f[o\u{00FC}]r linting").unwrap();
assert_eq!(commit.matches_pattern(&re), true);

let re = Regex::new("[Ee]xample Commit Message").unwrap();
assert_eq!(commit.matches_pattern(&re), true);
source

pub fn with_subject(self, subject: Subject<'a>) -> Self

Give you a new CommitMessage with the provided subject

Examples
use indoc::indoc;
use mit_commit::{CommitMessage, Subject};
use regex::Regex;

let commit = CommitMessage::from(indoc!(
    "
    Example Commit Message

    This is an example commit message
    "
));

assert_eq!(
    commit.with_subject("Subject".into()).get_subject(),
    Subject::from("Subject")
);
source

pub fn with_body_contents(self, contents: &'a str) -> Self

Give you a new CommitMessage with the provided body

Examples
use indoc::indoc;
use mit_commit::{CommitMessage, Subject};
use regex::Regex;

let commit = CommitMessage::from(indoc!(
    "
    Example Commit Message

    This is an example commit message
    "
));
let expected = CommitMessage::from(indoc!(
    "
    Example Commit Message

    New body"
));

assert_eq!(commit.with_body_contents("New body"), expected);

A note on what we consider the body. The body is what falls after the gutter. This means the following behaviour might happen

use indoc::indoc;
use mit_commit::{CommitMessage, Subject};
use regex::Regex;
let commit = CommitMessage::from(indoc!(
    "
    Example Commit Message
    without gutter"
));
let expected = CommitMessage::from(indoc!(
    "
    Example Commit Message
    without gutter

    New body"
));

assert_eq!(commit.with_body_contents("New body"), expected);
source

pub fn get_comment_char(&self) -> Option<char>

Give you a new CommitMessage with the provided body

Examples
use mit_commit::{CommitMessage, Subject};
let commit = CommitMessage::from("No comment\n\n# Some Comment");

assert_eq!(commit.get_comment_char().unwrap(), '#');

We return none is there is no comments

use mit_commit::{CommitMessage, Subject};
let commit = CommitMessage::from("No comment");

assert!(commit.get_comment_char().is_none());

Trait Implementations§

source§

impl<'a> Clone for CommitMessage<'a>

source§

fn clone(&self) -> CommitMessage<'a>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'a> Debug for CommitMessage<'a>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'a> Default for CommitMessage<'a>

source§

fn default() -> CommitMessage<'a>

Returns the “default value” for a type. Read more
source§

impl<'a> From<&'a str> for CommitMessage<'a>

source§

fn from(message: &'a str) -> CommitMessage<'a>

Converts to this type from the input type.
source§

impl<'a> From<CommitMessage<'a>> for String

source§

fn from(commit_message: CommitMessage<'_>) -> Self

Converts to this type from the input type.
source§

impl<'a> From<Cow<'a, str>> for CommitMessage<'a>

source§

fn from(message: Cow<'a, str>) -> CommitMessage<'a>

Create a new CommitMessage

Create a commit message from a string. It’s expected that you’ll be reading this during some sort of Git Hook

Examples
use indoc::indoc;
use mit_commit::{Bodies, CommitMessage, Subject};

let message = CommitMessage::from(indoc!(
    "
    Update bashrc to include kubernetes completions

    This should make it easier to deploy things for the developers.
    Benchmarked with Hyperfine, no noticable performance decrease.

    ; Bitte geben Sie eine Commit-Beschreibung f\u{00FC}r Ihre \u{00E4}nderungen ein. Zeilen,
    ; die mit ';' beginnen, werden ignoriert, und eine leere Beschreibung
    ; bricht den Commit ab.
    ;
    ; Datum:            Sat Jun 27 21:40:14 2020 +0200
    ;
    ; Auf Branch master
    ;
    ; Initialer Commit
    ;
    ; Zum Commit vorgemerkte \u{00E4}nderungen:
    ;    neue Datei:     .bashrc
    ;"
));
assert_eq!(
    message.get_subject(),
    Subject::from("Update bashrc to include kubernetes completions")
)
Comment Character

We load the comment character for the commit message

Valid options are in [LEGAL_CHARACTERS], these are the ’auto“ selection logic in the git codebase in the adjust_comment_line_char function.

This does mean that we aren’t making 100% of characters available, which is technically possible, but given we don’t have access to the users git config this feels like a reasonable compromise, there are a lot of non-whitespace characters as options otherwise, and we don’t want to confuse a genuine body with a comment

source§

impl<'a> From<String> for CommitMessage<'a>

source§

fn from(message: String) -> Self

Converts to this type from the input type.
source§

impl<'a> PartialEq<CommitMessage<'a>> for CommitMessage<'a>

source§

fn eq(&self, other: &CommitMessage<'a>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<'a> TryFrom<&'a Path> for CommitMessage<'a>

§

type Error = Error

The type returned in the event of a conversion error.
source§

fn try_from(value: &'a Path) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<'a> TryFrom<PathBuf> for CommitMessage<'a>

§

type Error = Error

The type returned in the event of a conversion error.
source§

fn try_from(value: PathBuf) -> Result<Self, Self::Error>

Performs the conversion.
source§

impl<'a> Eq for CommitMessage<'a>

source§

impl<'a> StructuralEq for CommitMessage<'a>

source§

impl<'a> StructuralPartialEq for CommitMessage<'a>

Auto Trait Implementations§

§

impl<'a> RefUnwindSafe for CommitMessage<'a>

§

impl<'a> Send for CommitMessage<'a>

§

impl<'a> Sync for CommitMessage<'a>

§

impl<'a> Unpin for CommitMessage<'a>

§

impl<'a> UnwindSafe for CommitMessage<'a>

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.