You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@subversion.apache.org by "Daniel Sahlberg (Jira)" <ji...@apache.org> on 2022/01/02 13:40:00 UTC
[jira] [Updated] (SVN-4711) invalid xml file produced by: svn log --xml --verbose --use-merge-history --search
[ https://issues.apache.org/jira/browse/SVN-4711?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Daniel Sahlberg updated SVN-4711:
---------------------------------
Description:
{{svn log --xml}} produces an invalid xml when the {{--use-merge-history}} option is combined with {{--search}}
Example:
{code:none}
svn log --xml --verbose --use-merge-history --search "msg1"
{code}
The xml contains two closing {{</logentry>}} tags, but only one opening {{<logentry>}} tag.
The bug can be easily reproduced with the script attached to this issue, it is also available here: [https://gist.github.com/anonymous/91aa228d6c22bff7ec2cbba2aecb2cd3]
*Expected output:*
xml with just one "</logentry>" line
*Actual output (see last lines):*
{code:none}
<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry
reverse-merge="false"
revision="3">
<author>xyz</author>
<date>2017-12-11T10:14:38.084171Z</date>
<paths>
<path
kind="file"
action="M"
prop-mods="false"
text-mods="true">/trunk/iota</path>
</paths>
<msg>msg1</msg>
</logentry>
</logentry>
</log>
{code}
Script to reproduce: [https://gist.github.com/anonymous/91aa228d6c22bff7ec2cbba2aecb2cd3]
{code:none}
#!/bin/sh
##############################################################################
## ##
## This is a template for writing Subversion bug reproduction scripts. ##
## ##
## It creates a repository containing the standard Greek Tree (see ##
## http://svn.apache.org/repos/asf/subversion/trunk/subversion/tests/greek-tree.txt) ##
## and checks out a working copy containing that tree. Please adjust ##
## this script however you need to to demonstrate your bug. When it's ##
## ready, post the bug report to dev@subversion.apache.org -- after ##
## http://subversion.apache.org/docs/community-guide/issues.html#reporting-bugs, ##
## of course. ##
## ##
##############################################################################
# You might need to adjust these lines to point to your
# compiled-from-source Subversion binaries, if using those:
if [ -z "$SVN" ]; then
SVN=`which svn`
# SVNSERVE=`which svnserve`
SVNADMIN=`which svnadmin`
fi
# Make sure we don't use $HOME/.subversion/.
if [ ! -d "`pwd`/svn-repro-config-dir" ]; then mkdir "`pwd`/svn-repro-config-dir"; fi
SVN="${SVN} --config-dir=`pwd`/svn-repro-config-dir"
SVNADMIN="${SVNADMIN} --config-dir=`pwd`/svn-repro-config-dir"
# SVNSERVE="${SVNSERVE} --config-dir=`pwd`/svn-repro-config-dir"
# Use English output.
LC_ALL=C; export LC_ALL
# Select an access method. If svn://, the svnserve setup is
# handled automagically by this script; but if http://, then
# you'll have to configure it yourself first.
#
# URL=http://localhost/SOMETHING/repos
# URL=svn://localhost/repos
URL=file:///`pwd`/repos
if [ -e repos ]; then rm -rf repos; fi
if [ -e wc ]; then rm -rf wc; fi
if [ -e import-me ]; then rm -rf import-me; fi
${SVNADMIN} create repos
# These are for svnserve only.
echo "[general]" > repos/conf/svnserve.conf
echo "anon-access = write" >> repos/conf/svnserve.conf
echo "auth-access = write" >> repos/conf/svnserve.conf
# The server will only be contacted if $URL is svn://foo, of course.
# ${SVNSERVE} --pid-file svnserve-pid -d -r `pwd`
# And put the kill command in a file, in case need to run it manually.
# echo "kill -9 `cat svnserve-pid`" > k
# chmod a+rwx k
echo "### Making a Greek Tree for import..."
mkdir import-me
mkdir import-me/trunk
mkdir import-me/tags
mkdir import-me/branches
mkdir import-me/trunk/A
mkdir import-me/trunk/A/B/
mkdir import-me/trunk/A/C/
mkdir import-me/trunk/A/D/
mkdir import-me/trunk/A/B/E/
mkdir import-me/trunk/A/B/F/
mkdir import-me/trunk/A/D/G/
mkdir import-me/trunk/A/D/H/
echo "This is the file 'iota'." > import-me/trunk/iota
echo "This is the file 'A/mu'." > import-me/trunk/A/mu
echo "This is the file 'A/B/lambda'." > import-me/trunk/A/B/lambda
echo "This is the file 'A/B/E/alpha'." > import-me/trunk/A/B/E/alpha
echo "This is the file 'A/B/E/beta'." > import-me/trunk/A/B/E/beta
echo "This is the file 'A/D/gamma'." > import-me/trunk/A/D/gamma
echo "This is the file 'A/D/G/pi'." > import-me/trunk/A/D/G/pi
echo "This is the file 'A/D/G/rho'." > import-me/trunk/A/D/G/rho
echo "This is the file 'A/D/G/tau'." > import-me/trunk/A/D/G/tau
echo "This is the file 'A/D/H/chi'." > import-me/trunk/A/D/H/chi
echo "This is the file 'A/D/H/omega'." > import-me/trunk/A/D/H/omega
echo "This is the file 'A/D/H/psi'." > import-me/trunk/A/D/H/psi
echo "### Done."
echo ""
echo "### Importing it..."
(cd import-me; ${SVN} import -q -m "Initial import." ${URL})
echo "### Done."
echo ""
${SVN} co -q ${URL}/trunk wc
cd wc
echo "### This is where your reproduction recipe goes. ###"
${SVN} cp ${URL}/trunk ${URL}/branches/b1 -m "b1"
echo x >> iota
${SVN} ci iota -m "msg1"
${SVN} switch ${URL}/branches/b1
${SVN} merge ${URL}/trunk
${SVN} ci -m "merged"
echo "### The following command will produce invalid xml (duplicated </logentry> tag):"
${SVN} log --xml --verbose --use-merge-history --search "msg1"
# Environment:
#
# Your operating system
# - Kubuntu 17.10 (Linux 4.13.0-17-generic #20-Ubuntu SMP Mon Nov 6 10:04:08 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux)
# The release and/or revision of Subversion
# - svn, version 1.9.7 (r1800392)
# - compiled Aug 17 2017, 10:20:03 on x86_64-pc-linux-gnu
# The compiler and configuration options you built Subversion with
# - (from apt)
# Any private modifications you made to your Subversion
# - (none)
# The version of Berkeley DB you're running Subversion with, if any
# - (none)
# Anything else that could possibly be relevant. Err on the side of too much information, rather than too little.
# - Expected output:
# xml with just one "</logentry>" line
# - Actual output (see last lines):
# <?xml version="1.0" encoding="UTF-8"?>
# <log>
# <logentry
# reverse-merge="false"
# revision="3">
# <author>xyz</author>
# <date>2017-12-11T10:14:38.084171Z</date>
# <paths>
# <path
# kind="file"
# action="M"
# prop-mods="false"
# text-mods="true">/trunk/iota</path>
# </paths>
# <msg>msg1</msg>
# </logentry>
# </logentry>
# </log>
cd ..
# Put kill command in a file, in case need to run it manually.
# echo "kill -9 `cat svnserve-pid`" > k
# chmod a+rwx k
# ./k
{code}
was:
{{svn log \-\-xml}} produces an invalid xml when the {{\-\-use-merge-history}} option is combined with {{\-\-search}}
Example:
{code:none}
svn log --xml --verbose --use-merge-history --search "msg1"
{code}
The xml contains two closing {{</logentry>}} tags, but only one opening {{<logentry>}} tag.
The bug can be easily reproduced with the script attached to this issue, it is also available here: https://gist.github.com/anonymous/91aa228d6c22bff7ec2cbba2aecb2cd3
*Expected output:*
xml with just one "</logentry>" line
*Actual output (see last lines):*
{code:none}
<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry
reverse-merge="false"
revision="3">
<author>xyz</author>
<date>2017-12-11T10:14:38.084171Z</date>
<paths>
<path
kind="file"
action="M"
prop-mods="false"
text-mods="true">/trunk/iota</path>
</paths>
<msg>msg1</msg>
</logentry>
</logentry>
</log>
{code}
Script to reproduce: https://gist.github.com/anonymous/91aa228d6c22bff7ec2cbba2aecb2cd3
{code:none}
#!/bin/sh
##############################################################################
## ##
## This is a template for writing Subversion bug reproduction scripts. ##
## ##
## It creates a repository containing the standard Greek Tree (see ##
## http://svn.apache.org/repos/asf/subversion/trunk/subversion/tests/greek-tree.txt) ##
## and checks out a working copy containing that tree. Please adjust ##
## this script however you need to to demonstrate your bug. When it's ##
## ready, post the bug report to dev@subversion.apache.org -- after ##
## http://subversion.apache.org/docs/community-guide/issues.html#reporting-bugs, ##
## of course. ##
## ##
##############################################################################
# You might need to adjust these lines to point to your
# compiled-from-source Subversion binaries, if using those:
if [ -z "$SVN" ]; then
SVN=`which svn`
# SVNSERVE=`which svnserve`
SVNADMIN=`which svnadmin`
fi
# Make sure we don't use $HOME/.subversion/.
if [ ! -d "`pwd`/svn-repro-config-dir" ]; then mkdir "`pwd`/svn-repro-config-dir"; fi
SVN="${SVN} --config-dir=`pwd`/svn-repro-config-dir"
SVNADMIN="${SVNADMIN} --config-dir=`pwd`/svn-repro-config-dir"
# SVNSERVE="${SVNSERVE} --config-dir=`pwd`/svn-repro-config-dir"
# Use English output.
LC_ALL=C; export LC_ALL
# Select an access method. If svn://, the svnserve setup is
# handled automagically by this script; but if http://, then
# you'll have to configure it yourself first.
#
# URL=http://localhost/SOMETHING/repos
# URL=svn://localhost/repos
URL=file:///`pwd`/repos
if [ -e repos ]; then rm -rf repos; fi
if [ -e wc ]; then rm -rf wc; fi
if [ -e import-me ]; then rm -rf import-me; fi
${SVNADMIN} create repos
# These are for svnserve only.
echo "[general]" > repos/conf/svnserve.conf
echo "anon-access = write" >> repos/conf/svnserve.conf
echo "auth-access = write" >> repos/conf/svnserve.conf
# The server will only be contacted if $URL is svn://foo, of course.
# ${SVNSERVE} --pid-file svnserve-pid -d -r `pwd`
# And put the kill command in a file, in case need to run it manually.
# echo "kill -9 `cat svnserve-pid`" > k
# chmod a+rwx k
echo "### Making a Greek Tree for import..."
mkdir import-me
mkdir import-me/trunk
mkdir import-me/tags
mkdir import-me/branches
mkdir import-me/trunk/A
mkdir import-me/trunk/A/B/
mkdir import-me/trunk/A/C/
mkdir import-me/trunk/A/D/
mkdir import-me/trunk/A/B/E/
mkdir import-me/trunk/A/B/F/
mkdir import-me/trunk/A/D/G/
mkdir import-me/trunk/A/D/H/
echo "This is the file 'iota'." > import-me/trunk/iota
echo "This is the file 'A/mu'." > import-me/trunk/A/mu
echo "This is the file 'A/B/lambda'." > import-me/trunk/A/B/lambda
echo "This is the file 'A/B/E/alpha'." > import-me/trunk/A/B/E/alpha
echo "This is the file 'A/B/E/beta'." > import-me/trunk/A/B/E/beta
echo "This is the file 'A/D/gamma'." > import-me/trunk/A/D/gamma
echo "This is the file 'A/D/G/pi'." > import-me/trunk/A/D/G/pi
echo "This is the file 'A/D/G/rho'." > import-me/trunk/A/D/G/rho
echo "This is the file 'A/D/G/tau'." > import-me/trunk/A/D/G/tau
echo "This is the file 'A/D/H/chi'." > import-me/trunk/A/D/H/chi
echo "This is the file 'A/D/H/omega'." > import-me/trunk/A/D/H/omega
echo "This is the file 'A/D/H/psi'." > import-me/trunk/A/D/H/psi
echo "### Done."
echo ""
echo "### Importing it..."
(cd import-me; ${SVN} import -q -m "Initial import." ${URL})
echo "### Done."
echo ""
${SVN} co -q ${URL}/trunk wc
cd wc
echo "### This is where your reproduction recipe goes. ###"
svn cp ${URL}/trunk ${URL}/branches/b1 -m "b1"
echo x >> iota
svn ci iota -m "msg1"
svn switch ${URL}/branches/b1
svn merge ${URL}/trunk
svn ci -m "merged"
echo "### The following command will produce invalid xml (duplicated </logentry> tag):"
svn log --xml --verbose --use-merge-history --search "msg1"
# Environment:
#
# Your operating system
# - Kubuntu 17.10 (Linux 4.13.0-17-generic #20-Ubuntu SMP Mon Nov 6 10:04:08 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux)
# The release and/or revision of Subversion
# - svn, version 1.9.7 (r1800392)
# - compiled Aug 17 2017, 10:20:03 on x86_64-pc-linux-gnu
# The compiler and configuration options you built Subversion with
# - (from apt)
# Any private modifications you made to your Subversion
# - (none)
# The version of Berkeley DB you're running Subversion with, if any
# - (none)
# Anything else that could possibly be relevant. Err on the side of too much information, rather than too little.
# - Expected output:
# xml with just one "</logentry>" line
# - Actual output (see last lines):
# <?xml version="1.0" encoding="UTF-8"?>
# <log>
# <logentry
# reverse-merge="false"
# revision="3">
# <author>xyz</author>
# <date>2017-12-11T10:14:38.084171Z</date>
# <paths>
# <path
# kind="file"
# action="M"
# prop-mods="false"
# text-mods="true">/trunk/iota</path>
# </paths>
# <msg>msg1</msg>
# </logentry>
# </logentry>
# </log>
cd ..
# Put kill command in a file, in case need to run it manually.
# echo "kill -9 `cat svnserve-pid`" > k
# chmod a+rwx k
# ./k
{code}
> invalid xml file produced by: svn log --xml --verbose --use-merge-history --search
> ----------------------------------------------------------------------------------
>
> Key: SVN-4711
> URL: https://issues.apache.org/jira/browse/SVN-4711
> Project: Subversion
> Issue Type: Bug
> Components: cmdline client
> Affects Versions: 1.9.5, 1.9.7, trunk
> Environment: OS:
> * Kubuntu 17.10 (Linux 4.13.0-17-generic #20-Ubuntu SMP Mon Nov 6 10:04:08 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux)
> * Windows 7
> Checked with svn versions:
> * svn, version 1.9.7 (r1800392) compiled Aug 17 2017, 10:20:03 on x86_64-pc-linux-gnu
> * svn version 1.9.5 (r1770682) compiled Nov 26 2016, 14:22:31 on x86-microsoft-windows)
> * also trunk 1.11.0-dev confirmed by "danielsh" on IRC: http://sprunge.us/YYbL (thanks)
> Additional information:
> * The compiler and configuration options you built Subversion with: from apt
> * Any private modifications you made to your Subversion: (none)
> * The version of Berkeley DB you're running Subversion with, if any: (none)
> Reporter: Martin Obermeir
> Priority: Major
> Labels: bite-sized
> Attachments: tests.zip
>
>
> {{svn log --xml}} produces an invalid xml when the {{--use-merge-history}} option is combined with {{--search}}
> Example:
> {code:none}
> svn log --xml --verbose --use-merge-history --search "msg1"
> {code}
> The xml contains two closing {{</logentry>}} tags, but only one opening {{<logentry>}} tag.
> The bug can be easily reproduced with the script attached to this issue, it is also available here: [https://gist.github.com/anonymous/91aa228d6c22bff7ec2cbba2aecb2cd3]
> *Expected output:*
> xml with just one "</logentry>" line
> *Actual output (see last lines):*
> {code:none}
> <?xml version="1.0" encoding="UTF-8"?>
> <log>
> <logentry
> reverse-merge="false"
> revision="3">
> <author>xyz</author>
> <date>2017-12-11T10:14:38.084171Z</date>
> <paths>
> <path
> kind="file"
> action="M"
> prop-mods="false"
> text-mods="true">/trunk/iota</path>
> </paths>
> <msg>msg1</msg>
> </logentry>
> </logentry>
> </log>
> {code}
> Script to reproduce: [https://gist.github.com/anonymous/91aa228d6c22bff7ec2cbba2aecb2cd3]
> {code:none}
> #!/bin/sh
> ##############################################################################
> ## ##
> ## This is a template for writing Subversion bug reproduction scripts. ##
> ## ##
> ## It creates a repository containing the standard Greek Tree (see ##
> ## http://svn.apache.org/repos/asf/subversion/trunk/subversion/tests/greek-tree.txt) ##
> ## and checks out a working copy containing that tree. Please adjust ##
> ## this script however you need to to demonstrate your bug. When it's ##
> ## ready, post the bug report to dev@subversion.apache.org -- after ##
> ## http://subversion.apache.org/docs/community-guide/issues.html#reporting-bugs, ##
> ## of course. ##
> ## ##
> ##############################################################################
> # You might need to adjust these lines to point to your
> # compiled-from-source Subversion binaries, if using those:
> if [ -z "$SVN" ]; then
> SVN=`which svn`
> # SVNSERVE=`which svnserve`
> SVNADMIN=`which svnadmin`
> fi
> # Make sure we don't use $HOME/.subversion/.
> if [ ! -d "`pwd`/svn-repro-config-dir" ]; then mkdir "`pwd`/svn-repro-config-dir"; fi
> SVN="${SVN} --config-dir=`pwd`/svn-repro-config-dir"
> SVNADMIN="${SVNADMIN} --config-dir=`pwd`/svn-repro-config-dir"
> # SVNSERVE="${SVNSERVE} --config-dir=`pwd`/svn-repro-config-dir"
> # Use English output.
> LC_ALL=C; export LC_ALL
> # Select an access method. If svn://, the svnserve setup is
> # handled automagically by this script; but if http://, then
> # you'll have to configure it yourself first.
> #
> # URL=http://localhost/SOMETHING/repos
> # URL=svn://localhost/repos
> URL=file:///`pwd`/repos
> if [ -e repos ]; then rm -rf repos; fi
> if [ -e wc ]; then rm -rf wc; fi
> if [ -e import-me ]; then rm -rf import-me; fi
> ${SVNADMIN} create repos
> # These are for svnserve only.
> echo "[general]" > repos/conf/svnserve.conf
> echo "anon-access = write" >> repos/conf/svnserve.conf
> echo "auth-access = write" >> repos/conf/svnserve.conf
> # The server will only be contacted if $URL is svn://foo, of course.
> # ${SVNSERVE} --pid-file svnserve-pid -d -r `pwd`
> # And put the kill command in a file, in case need to run it manually.
> # echo "kill -9 `cat svnserve-pid`" > k
> # chmod a+rwx k
> echo "### Making a Greek Tree for import..."
> mkdir import-me
> mkdir import-me/trunk
> mkdir import-me/tags
> mkdir import-me/branches
> mkdir import-me/trunk/A
> mkdir import-me/trunk/A/B/
> mkdir import-me/trunk/A/C/
> mkdir import-me/trunk/A/D/
> mkdir import-me/trunk/A/B/E/
> mkdir import-me/trunk/A/B/F/
> mkdir import-me/trunk/A/D/G/
> mkdir import-me/trunk/A/D/H/
> echo "This is the file 'iota'." > import-me/trunk/iota
> echo "This is the file 'A/mu'." > import-me/trunk/A/mu
> echo "This is the file 'A/B/lambda'." > import-me/trunk/A/B/lambda
> echo "This is the file 'A/B/E/alpha'." > import-me/trunk/A/B/E/alpha
> echo "This is the file 'A/B/E/beta'." > import-me/trunk/A/B/E/beta
> echo "This is the file 'A/D/gamma'." > import-me/trunk/A/D/gamma
> echo "This is the file 'A/D/G/pi'." > import-me/trunk/A/D/G/pi
> echo "This is the file 'A/D/G/rho'." > import-me/trunk/A/D/G/rho
> echo "This is the file 'A/D/G/tau'." > import-me/trunk/A/D/G/tau
> echo "This is the file 'A/D/H/chi'." > import-me/trunk/A/D/H/chi
> echo "This is the file 'A/D/H/omega'." > import-me/trunk/A/D/H/omega
> echo "This is the file 'A/D/H/psi'." > import-me/trunk/A/D/H/psi
> echo "### Done."
> echo ""
> echo "### Importing it..."
> (cd import-me; ${SVN} import -q -m "Initial import." ${URL})
> echo "### Done."
> echo ""
> ${SVN} co -q ${URL}/trunk wc
> cd wc
> echo "### This is where your reproduction recipe goes. ###"
> ${SVN} cp ${URL}/trunk ${URL}/branches/b1 -m "b1"
> echo x >> iota
> ${SVN} ci iota -m "msg1"
> ${SVN} switch ${URL}/branches/b1
> ${SVN} merge ${URL}/trunk
> ${SVN} ci -m "merged"
> echo "### The following command will produce invalid xml (duplicated </logentry> tag):"
> ${SVN} log --xml --verbose --use-merge-history --search "msg1"
> # Environment:
> #
> # Your operating system
> # - Kubuntu 17.10 (Linux 4.13.0-17-generic #20-Ubuntu SMP Mon Nov 6 10:04:08 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux)
> # The release and/or revision of Subversion
> # - svn, version 1.9.7 (r1800392)
> # - compiled Aug 17 2017, 10:20:03 on x86_64-pc-linux-gnu
> # The compiler and configuration options you built Subversion with
> # - (from apt)
> # Any private modifications you made to your Subversion
> # - (none)
> # The version of Berkeley DB you're running Subversion with, if any
> # - (none)
> # Anything else that could possibly be relevant. Err on the side of too much information, rather than too little.
> # - Expected output:
> # xml with just one "</logentry>" line
> # - Actual output (see last lines):
> # <?xml version="1.0" encoding="UTF-8"?>
> # <log>
> # <logentry
> # reverse-merge="false"
> # revision="3">
> # <author>xyz</author>
> # <date>2017-12-11T10:14:38.084171Z</date>
> # <paths>
> # <path
> # kind="file"
> # action="M"
> # prop-mods="false"
> # text-mods="true">/trunk/iota</path>
> # </paths>
> # <msg>msg1</msg>
> # </logentry>
> # </logentry>
> # </log>
> cd ..
> # Put kill command in a file, in case need to run it manually.
> # echo "kill -9 `cat svnserve-pid`" > k
> # chmod a+rwx k
> # ./k
> {code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)