You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@subversion.apache.org by Carlos Alberto Costa Beppler <be...@gmail.com> on 2015/03/31 17:18:24 UTC

start-commit log message.

Hi, I'm trying to validate the log message using the new 1.8 start-commit 
capability of inspect the transaction beeing created.

My problem is that if the client is using an older version (like 1.7) the 
commit message obtained using svnlook is always empty durng the 
start-commit. In this case the commit message is available only during 
pre-commit.

All of this is is working well if the client is using 1.8 version.

The text bellow is an copy of my start-commit hook:

#!/usr/bin/env python
# The start-commit hook is invoked before a Subversion txn is created
# in the process of doing a commit.  Subversion runs this hook
# by invoking a program (script, executable, binary, etc.) named
# 'start-commit' (for which this file is a template)
# with the following ordered arguments:
#
#   [1] REPOS-PATH   (the path to this repository)
#   [2] USER         (the authenticated user attempting to commit)
#   [3] CAPABILITIES (a colon-separated list of capabilities reported
#                     by the client; see note below)
#   [4] TXN-NAME     (the name of the commit txn just created (1.8 or 
newer))
#
import sys
import subprocess

def get_svn_log(txn, repos):
  child = 
subprocess.Popen(['/usr/bin/svnlook','log','-t',txn,repos],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  out,err = child.communicate()
  if child.returncode:
    return ('',err)
  return (out,'')

repo = sys.argv[1]
capabilities = sys.argv[3].split(':')
txn = sys.argv[4]

if 'mergeinfo' not in capabilities:
  sys.stderr.write('Commits from merge-tracking-unaware clients are not 
permitted.\n'
                   'Please upgrade to Subversion 1.5 or newer.\n')
  sys.exit(1)

log, err = get_svn_log(txn,repo)
if err:
  sys.stderr.write('Error verifying log message: '+err)
  sys.exit(1)
elif not log.strip():
  sys.stderr.write('Commits without log message are not permitted.\n'
                   'Please enter the log message.\n')
  sys.exit(1)

sys.exit(0)





Re: start-commit log message.

Posted by Carlos Alberto Costa Beppler <be...@gmail.com>.
Only to record.

I solved the problem looking for ephemeral properties on commit. They are 
only sent for 1.8 clients.

To do this I changed my start-commit hook was to this:

#!/usr/bin/env python
# The start-commit hook is invoked before a Subversion txn is created
# in the process of doing a commit.  Subversion runs this hook
# by invoking a program (script, executable, binary, etc.) named
# 'start-commit' (for which this file is a template)
# with the following ordered arguments:
#
#   [1] REPOS-PATH   (the path to this repository)
#   [2] USER         (the authenticated user attempting to commit)
#   [3] CAPABILITIES (a colon-separated list of capabilities reported
#                     by the client; see note below)
#   [4] TXN-NAME     (the name of the commit txn just created (1.8 or 
newer))
#
import sys
import subprocess

def get_svn_txn_proplist(repos,txn):
  child = 
subprocess.Popen(['/usr/bin/svnlook','proplist','--revprop',repos,'-t',txn],
                           stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  out,err = child.communicate()
  if child.returncode:
    return ([],err)
  return ([p.strip() for p in out.strip().split('\n')],'')

def get_svn_txn_log(repos,txn):
  child = subprocess.Popen(['/usr/bin/svnlook','log','-t',txn,repos],
                           stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  out,err = child.communicate()
  if child.returncode:
    return ('',err)
  return (out,'')

capabilities = sys.argv[3].split(':')

if 'mergeinfo' not in capabilities:
  sys.stderr.write('Commits from merge-tracking-unaware clients are not 
permitted.\n'
                   'Please upgrade to Subversion 1.5 or newer.\n')
  sys.exit(1)

repos = sys.argv[1]
txn = sys.argv[4]

log,err = get_svn_txn_log(repos,txn)
if err:
  sys.stderr.write('Error inspecting commit log: '+err)
  sys.exit(1)
elif not log.strip():
  proplist,err = get_svn_txn_proplist(repos,txn)
  if err:
    sys.stderr.write('Error inspecting commit properties: '+err)
    sys.exit(1)
  elif 'svn:txn-user-agent' in proplist:
    sys.stderr.write('Commits without log message are not permitted.\n'
                     'Please enter the log message.\n')
    sys.exit(1)

sys.exit(0)


On Tuesday, March 31, 2015 at 12:34:36 PM UTC-3, Carlos Alberto Costa 
Beppler wrote:
>
> Sorry for asking without proprer documentation read and thanks.
>
> There is a way to "detect" that the log message is not sent because of an 
> older client version?
>
> My intent is to block the commit early if I can.
>
> On Tuesday, March 31, 2015 at 12:28:37 PM UTC-3, Andreas Stieger wrote:
>>
>> Hello, 
>>   
>>
>> > validate the log message [...] start-commit [...] 
>> > [...] 
>> > if the client is using an older version (like 1.7) the commit message 
>> obtained 
>> > using svnlook is always empty durng the start-commit. In this case the 
>> commit 
>> > message is available only during pre-commit. 
>>   
>> Yes, and this is expected, documented [1] and will not change. Quoting: 
>> [[[ 
>> Note: Subversion does not require that commit transaction properties 
>> (such as the revision log message) be attached to the transaction as part 
>> of its initialization. As such, some clients will still not provide that 
>> information to the server until after the start-commit hook has been 
>> invoked. Here is a list of such clients we are aware of: 
>>
>>     Pre-1.8 clients communicating via HTTP 
>>     Clients communicating via HTTP when mod_dav_svn's 
>> "SVNAdvertiseV2Protocol" option has been set to "off" 
>>
>> Administrators should consider modularizing the tests that their hooks 
>> perform on transaction properties, invoke those tests from both the 
>> start-commit and pre-commit hook scripts." 
>> ]]] 
>>
>> You will need to run the same hook again as pre-commit. 
>>
>> [1] 
>> https://subversion.apache.org/docs/release-notes/1.8.html#hooks-start-commit 
>> <https://www.google.com/url?q=https%3A%2F%2Fsubversion.apache.org%2Fdocs%2Frelease-notes%2F1.8.html%23hooks-start-commit&sa=D&sntz=1&usg=AFQjCNG5AarLHZr4kAfA6cuRwPNj6Qeohg> 
>>
>> Andreas 
>>
>

Re: start-commit log message.

Posted by Carlos Alberto Costa Beppler <be...@gmail.com>.
Sorry for asking without proprer documentation read and thanks.

There is a way to "detect" that the log message is not sent because of an 
older client version?

My intent is to block the commit early if I can.

On Tuesday, March 31, 2015 at 12:28:37 PM UTC-3, Andreas Stieger wrote:
>
> Hello, 
>   
>
> > validate the log message [...] start-commit [...] 
> > [...] 
> > if the client is using an older version (like 1.7) the commit message 
> obtained 
> > using svnlook is always empty durng the start-commit. In this case the 
> commit 
> > message is available only during pre-commit. 
>   
> Yes, and this is expected, documented [1] and will not change. Quoting: 
> [[[ 
> Note: Subversion does not require that commit transaction properties (such 
> as the revision log message) be attached to the transaction as part of its 
> initialization. As such, some clients will still not provide that 
> information to the server until after the start-commit hook has been 
> invoked. Here is a list of such clients we are aware of: 
>
>     Pre-1.8 clients communicating via HTTP 
>     Clients communicating via HTTP when mod_dav_svn's 
> "SVNAdvertiseV2Protocol" option has been set to "off" 
>
> Administrators should consider modularizing the tests that their hooks 
> perform on transaction properties, invoke those tests from both the 
> start-commit and pre-commit hook scripts." 
> ]]] 
>
> You will need to run the same hook again as pre-commit. 
>
> [1] 
> https://subversion.apache.org/docs/release-notes/1.8.html#hooks-start-commit 
> <https://www.google.com/url?q=https%3A%2F%2Fsubversion.apache.org%2Fdocs%2Frelease-notes%2F1.8.html%23hooks-start-commit&sa=D&sntz=1&usg=AFQjCNG5AarLHZr4kAfA6cuRwPNj6Qeohg> 
>
> Andreas 
>

Aw: start-commit log message.

Posted by Andreas Stieger <An...@gmx.de>.
Hello,
 

> validate the log message [...] start-commit [...] 
> [...]
> if the client is using an older version (like 1.7) the commit message obtained 
> using svnlook is always empty durng the start-commit. In this case the commit
> message is available only during pre-commit.
 
Yes, and this is expected, documented [1] and will not change. Quoting:
[[[
Note: Subversion does not require that commit transaction properties (such as the revision log message) be attached to the transaction as part of its initialization. As such, some clients will still not provide that information to the server until after the start-commit hook has been invoked. Here is a list of such clients we are aware of:

    Pre-1.8 clients communicating via HTTP
    Clients communicating via HTTP when mod_dav_svn's "SVNAdvertiseV2Protocol" option has been set to "off"

Administrators should consider modularizing the tests that their hooks perform on transaction properties, invoke those tests from both the start-commit and pre-commit hook scripts."
]]]

You will need to run the same hook again as pre-commit.

[1] https://subversion.apache.org/docs/release-notes/1.8.html#hooks-start-commit

Andreas