Re: [ANNOUNCE] chronoversion: chronological archiving script with temporary commits
From: Shawn O. Pearce <hidden>
Date: 2016-06-15 22:42:59
David Tweed [off-list ref] wrote:
A question for those who understand things: I stash the last written _tree_'s hash in a tag and then when a new "commit's" directory tree is written starts look to see if it's the same SHA value. If it is I know I can avoid the commit. At the moment I'm using if os.path.exists(lastTreeFile) and tree==open(lastTreeFile,"r").read()[:40]: to be safe just in case a user, eg, goes mad and manually deletes that record. Clearly this is going to hit trouble if git ever decides to put this tag into a packed refs file. Is there any neat way of using builtin stuff like git-rev-parse to ask if a ref has a given SHA1 value and return an easily parsed yes/no answer?
The common idiom if you want to compare trees to see if you
need to make a commit is:
oldc=`git rev-parse $tagname^{commit}`
oldt=`git rev-parse $oldc^{tree}`
newt`git write-tree`
if [ X$oldt = X$newt ]; then
: nothing to save
else
newc=`git commit-tree $newt -p $oldc`
git update-ref $tagname $newc $oldc
fi
Yes, a little ugly. But its safe; if another program were to
alter the value of $tagname (e.g. "git branch -f", "git tag -f")
while your script is running the update-ref in the else will fail,
letting you know that $tagname changed in the process.
--
Shawn.