Efficiently comparing generated code between two Git revisions of the source

孤街浪徒 提交于 2019-12-08 04:08:56

问题


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:


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


来源:https://stackoverflow.com/questions/16754922/efficiently-comparing-generated-code-between-two-git-revisions-of-the-source

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!