git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Problem with contrib/hooks/post-receive-email

From
APAndy Parkins <andyparkins@gmail.com>
Date
Mar 19, 2010, 16:39 UTC
Message-ID
<ho09bh$hdh$1@dough.gmane.org>
In-Reply-To
<m3vdcsq0hl.fsf@winooski.ccs.neu.edu>
Eli Barzilay wrote:
Show 6 quoted lines
> The post-receive-email script goes out of its way to avoid sending
> commits twice by filtering out commits that are included in existing
> refs, but if more than one branch changes then some commits can end up
> not being reported.  For example, I made two commits A and B, made one
> branch point at A and another at B, and pushed both -- neither of the
> resulting two emails had A.
<Andy starts crying>

I can't see any way to deal with this case easily with post-receive-email as it is. It inherently processes ref-by-ref. The relevant bit of script is in generate_update_branch_email(). The comments explain how the same problem is addressed for another developer changing the same branch before post-receive-email runs, but after the update is performed. I think the same method could be applied.

  git rev-parse --not --all | grep -v $(git rev-parse $refname)

This line is where the particular branches are being included and excluded. The problem you have is that "--all" means "--all-at-the-moment", and you want "--all-as-they-were-before-the-update".

So, --all will have to go, and a manual list built instead. The supplied change list includes all the information necessary:

 ref1_oldrev ref1_newrev ref1
 ref2_oldrev ref2_newrev ref2
 ref3_oldrev ref3_newrev ref3
 ref4_oldrev ref4_newrev ref4

Let's say there is also a ref5 and ref6 in the repository. The revision list we want for (say) the ref1 call to generate_email would be:

 ref1_newrev
 ^ref2_oldrev
 ^ref3_oldrev
 ^ref4_oldrev
 ^ref5
 ^ref6

And similarly for ref2, ref3 and ref4. It seems to me that it needs a hash table keyed on the refname, but I have no idea how to do that in bash.

 %originalreftable{"ref1"} = "^ref1_oldrev"
 %originalreftable{"ref2"} = "^ref2_oldrev"
 %originalreftable{"ref3"} = "^ref3_oldrev"
 %originalreftable{"ref4"} = "^ref4_oldrev"
 %originalreftable{"ref5"} = "^ref5"
 %originalreftable{"ref6"} = "^ref6"

This table would be sufficient to create the revision list for every generate_email(), because each generate_email() knows which ref it's being updated for, so could easily do:

 %originalreftable{$myref} = "$mynewrev"
Before using the table (and restore it afterwards).

In short: yuck. It feels an awful lot like its pushing the boundaries of what is sensible to do in shell script.

Andy
-- 
Dr Andy Parkins
andyparkins@gmail.com
Previous: Eli BarzilayNext: Brandon Casey
Message 2 of 4 in “Problem with contrib/hooks/post-receive-email”
  1. Eli BarzilayMar 19, 2010
  2. Andy ParkinsMar 19, 2010
  3. Brandon CaseyMar 19, 2010
  4. Eli BarzilayMar 20, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.