Efficiently comparing generated code between two G

2019-06-06 01:37发布

Assuming the answer to should I store generated code in source control is "no", what is the best way to compare the generated code for changes (expected or unexpected) when the source code is changed?

In this scenario,

  • All developers have the tools to perform code generation locally
  • The code generation is fast
  • The generated files are large

1条回答
Luminary・发光体
2楼-- · 2019-06-06 01:56

Here is a Bash script that can compare a single generated file between the previous and current revisions:

#!/bin/bash -x

# Compares a generated file between the current revision and an old revision.
#
# XXX We do not use the "-e" Bash option if our intent is merely to
# inspect the changes in generated code, because the "diff" command
# will return "1" if there are changes, terminating this script early.
#
# If, however, our intent is to use this script as a pre-commit hook
# to ensure that the generated code does not change, we should
# enable the "-e" flag and add the "--quiet" option to the diff command
# (which implies the "--exit-code" option, according to the docs).


# XXX Note: the leading "./" to indicate a current-directory-relative path
# is important for the diff command below.
FILENAME=./hellofile.txt
OLD_REVISION=HEAD~

# TODO Replace this with any "build step", e.g. "make <target>"
FILE_PRODUCTION_COMMAND='eval echo "hello $(git rev-parse --short HEAD)" > $FILENAME'

# Stash the entire working tree, including build artifacts
git stash --all

# Produce the modern version of the derived content to be compared
$FILE_PRODUCTION_COMMAND

# Mark the file as something that should be saved in the stash
# The --force command is for in case the file has been marked in the .gitignore file
git add --force $FILENAME

# Preserve the file for later comparison
git stash

# Move to the old version of the source code
git checkout $OLD_REVISION

# Produce the old version of the derived content to be compared
$FILE_PRODUCTION_COMMAND

# Launch a textual or graphical diff viewer to see the changes in the derived content
# We use the "-R" option because we have stashed the newer content.
git diff -R stash@{0}:$FILENAME -- $FILENAME
#git difftool -R stash@{0}:$FILENAME -- $FILENAME

# Discard the most recent stash
git stash drop

# Clean everything, including ignored files; leaves clone totally pristine
git clean -fxd $(git rev-parse --show-toplevel)

# Go back to modern version of the source code
git checkout -

# Restore our original working tree, including build artifacts
git stash pop
查看更多
登录 后发表回答