// getDiffChanges takes two revisions from which to generate a "git diff", and returns a // slice of "changes" objects that represent that diff as parsed by Phabricator. func (arc Arcanist) getDiffChanges(repo repository.Repo, from, to string) ([]interface{}, error) { // TODO(ojarjur): This is a big hack, but so far there does not seem to be a better solution: // We need to pass a list of "changes" JSON objects that contain the parsed diff contents. // The simplest way to do that parsing seems to be to create a rawDiff and have Phabricator // parse it on the server side. We then read back that diff, and return the changes from it. rawDiff, err := repo.Diff(from, to, "-M", "--no-ext-diff", "--no-textconv", "--src-prefix=a/", "--dst-prefix=b/", fmt.Sprintf("-U%d", 0x7fff), "--no-color") if err != nil { return nil, err } createRequest := differentialCreateRawDiffRequest{Diff: rawDiff} var createResponse differentialCreateRawDiffResponse runArcCommandOrDie("differential.createrawdiff", createRequest, &createResponse) if createResponse.Error != "" { return nil, fmt.Errorf(createResponse.ErrorMessage) } diffID := createResponse.Response.ID diff, err := readDiff(diffID) if err != nil { return nil, err } if diff != nil { return diff.Changes, nil } return nil, fmt.Errorf("Failed to retrieve the raw diff for %s..%s", from, to) }