run method

  1. @override
Future run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future run() async {
  var gitRootDir = GitRepository.findRootDir(Directory.current.path)!;
  var repo = await GitRepository.load(gitRootDir);

  var hash = argResults!.arguments[0];
  var objRes = await repo.objStorage.read(GitHash(hash));
  if (objRes.failed) {
    print('fatal: bad object $hash');
    return;
  }
  var obj = objRes.get();

  if (obj is! GitCommit) {
    print('error: object $hash is a ${obj.formatStr()}, not a commit');
    return;
  }
  var commit = obj;
  var parentHash = commit.parents.first;
  var parentObj = await repo.objStorage.read(parentHash);

  var taHash = (parentObj as GitCommit).treeHash;
  var tbHash = obj.treeHash;

  var results = diffTree(
    (await repo.objStorage.readTree(taHash)).get(),
    (await repo.objStorage.readTree(tbHash)).get(),
  );

  for (var r in results.merged()) {
    var prevMode = ''.padLeft(6, '0');
    var newMode = ''.padLeft(6, '0');
    var prevHash = ''.padLeft(40, '0');
    var newHash = ''.padLeft(40, '0');

    var state = 'M';
    if (r.added) {
      state = 'A';
      newMode = r.to!.mode.toString().padLeft(6, '0');
      newHash = r.to!.hash.toString();
    } else if (r.deleted) {
      state = 'D';
      prevMode = r.from!.mode.toString().padLeft(6, '0');
      prevHash = r.from!.hash.toString();
    } else {
      newMode = r.to!.mode.toString().padLeft(6, '0');
      newHash = r.to!.hash.toString();
      prevMode = r.from!.mode.toString().padLeft(6, '0');
      prevHash = r.from!.hash.toString();
    }

    print(':$prevMode $newMode $prevHash $newHash $state\t${r.name}');
  }
}