commit_info

Safely get version control information in a Dart project.

Features

Sometimes, especially in prototype or development phases, you need your app to include information about the exact commit it was built from. But due to how the Flutter build system works, that can be challenging, possibly even get a little hacky.

Enter commit_info. This little codegen will create a file commit_info.g.dart, in this format:

class CommitInfo {
  final String commitId;
  final String commitIdShort;
  final int? timestamp;
  final String? branch;
  final bool? localChanges;

  const CommitInfo({
    required this.commitId,
    required this.commitIdShort,
    required this.timestamp,
    required this.branch,
    this.localChanges = false,
  });

  DateTime? get dateTime => timestamp == null ? null : DateTime.fromMicrosecondsSinceEpoch(timestamp!);
}

const CommitInfo? commitInfo = CommitInfo(
  commitId: "2685ecba8f68feae8f42acb3bc001e73a9290cc5",
  commitIdShort: "2685ecb",
  timestamp: 1693745311,
  branch: "main",
  localChanges: true,
);

You might want to .gitignore this file, if you want to avoid any risk of having the wrong version info in builds. (Yes, I know I could also generate the file in the build cache, but flutter doesn't find it there...)

It currently supports git only, but it's designed to be agnostic, and support for other VC systems should be easy to add.

Of course, it has no Flutter dependencies, so you can also use it in any Dart projects. In fact, if you build your project with build, it should be even more useful, as it will integrate seamlessly.

Getting started

flutter pub add dev:commit_info dev:build_runner

The only real prerequisite is, the command line tools for the VC system you want to use have to be available in any environment where you want to run this (including CI).

Usage

To consume the commit info, just import it and use the commitInfo const.

import 'commit_info.g.dart';

class CommitInfoWidget extends StatelessWidget {
  const CommitInfoWidget({super.key});

  @override
  Widget build(BuildContext context) => Text((commitInfo == null)
      ? "unknown"
      : "commit ${commitInfo!.commitIdShort} on ${commitInfo!.branch}, from ${commitInfo!.timestamp}${commitInfo!.localChanges ? " (with local changes)" : ""}");
}

You can find a (barely) more involved example in the example folder in this library's git repository.

Unfortunately, since the Flutter build tool is not extensible as of this writing, you need to run the builder yourself before building your app. Do it with this command line:

dart run build_runner build

On CI, just add that before your flutter build step. On development, there's no need to run it for each build; it should be sufficient to do it once per coding session, or if you want the info to be accurate, once per commit. If you prefer to run Flutter from your editor or IDE, you can add an action to run it for you.

If you don't want to run it in CI though, just run this instead:

dart run commit_info:initialize

This will create a commit_info.g.dart with a null CommitInfo.

You can also run this to create a null CommitInfo to push to VC, as an alternative to gitignoreing the generated file. That's a little bothersome as you'd need to revert this file before every commit, but it's an option.

Libraries

commit_info