Extracting the Commit Message from a bzr post-commit Hook

If you’re working with Bazaar (bzr) and looking to integrate a simple bug tracker that tracks commit messages, you may find yourself struggling to extract the commit message using the bzr post-commit hook. This is a common issue for developers who want to automate tasks following code commits and need to access relevant information from the repository. In this blog post, we’ll go through the solution step-by-step, clarifying how to effectively retrieve the commit message in Python.

Understanding the bzr post-commit Hook

The bzr post-commit hook is a feature that allows you to execute custom scripts after a commit occurs in your repository. This is particularly useful for automation tasks such as notifying a bug tracker, sending alerts, or logging activity.

The Function Signature

The function signature for the post_commit hook includes several parameters:

post_commit(local, master, old_revno, old_revid, new_revno, new_revid)

Understanding these parameters is crucial:

  • local: The current branch object where the commit occurred.
  • master: The master branch object, which may reference the same as local in some scenarios.
  • old_revno: The revision number prior to the commit.
  • old_revid: The revision ID prior to the commit.
  • new_revno: The new revision number after the commit.
  • new_revid: The new revision ID after the commit.

With this understanding, let’s see how we can extract the commit message.

The Solution: Extracting the Commit Message

You can retrieve the commit message by focusing on the new_revid parameter that reflects the commit’s unique identifier. Below is a simple yet effective function to achieve this:

def check_commit_msg(local, master, old_revno, old_revid, new_revno, new_revid):
    branch = local or master
    revision = branch.repository.get_revision(new_revid)
    print(revision.message)

Step-by-Step Breakdown

  1. Identify the Branch: The first step in the function is to designate which branch to work with. This is accomplished by selecting local if available, or master if not.

  2. Get the Revision: Next, utilize the get_revision method from the branch’s repository. This method requires the new_revid, which corresponds to the latest commit.

  3. Print the Commit Message: Finally, simply extract the message attribute from the revision object and print it. This provides the commit message directly from the repository.

Example Usage

To use this function, you would typically call it within the context of your post-commit hook setup, ensuring that you pass the appropriate parameters as specified by the hook’s definition. Here’s a conceptual example of how you might call it:

def post_commit(local, master, old_revno, old_revid, new_revno, new_revid):
    check_commit_msg(local, master, old_revno, old_revid, new_revno, new_revid)

Conclusion

By utilizing the check_commit_msg function, developers can easily access the latest commit message right after a commit action has taken place in a Bazaar repository. This capability significantly enhances the potential for automation and integration, especially when setting up a systems like bug trackers.

With the information provided here, you should now be well-equipped to implement and utilize a bzr post-commit hook to get relevant commit messages in your own projects.