refSpec method

Future<GitObjectResult> refSpec(
  1. GitTree tree,
  2. String spec
)

Implementation

Future<GitObjectResult> refSpec(GitTree tree, String spec) async {
  assert(!spec.startsWith(p.separator));

  if (spec.isEmpty) {
    return GitObjectResult(tree);
  }

  var parts = splitPath(spec);
  var name = parts.item1;
  var remainingName = parts.item2;

  for (var leaf in tree.entries) {
    if (leaf.name == name) {
      var result = await read(leaf.hash);
      var obj = result.get();

      if (remainingName.isEmpty) {
        return GitObjectResult(obj);
      }

      if (obj is GitTree) {
        return refSpec(obj, remainingName);
      } else {
        return GitObjectResult.fail(
          GitObjectWithRefSpecNotFound(spec),
        );
      }
    }
  }
  return GitObjectResult.fail(
    GitObjectWithRefSpecNotFound(spec),
  );
}