On Mon, Oct 30, 2017 at 03:11:20PM +0100, Branko Čibej wrote: > On 30.10.2017 14:54, Norbert Preining wrote: > > Dear all, > > > > (please Cc, I am not subscribed) > > > > I have blogged about this [1] and both Branko Čibej and Stefan Sperling > > asked me to move the discussion here. > > [1] > > https://www.preining.info/blog/2017/10/inconsistent-version-numbers-in-subversion/ > > > > I describe my problem > > > > * Assume a subversion server and two checkouts > > * both checkout are completely clean, no out-of-vcs files, no > > ignored files, no mixed revisions, dead plain svn checkouts. > > I'm pretty sure they're not, but see below. > > > * Furthermore, assume the following set of commits: > > > > revision A: file xxx is changed > > revision A+n: file xxx is changed again > > revision A+n+m: file xxx is changed and takes the same content > > as back in revision A > > > > Assume two users: > > User A did 'svn up' between revision A+n and A+n+m > > User B did 'svn up' in [A, A+n), but NOT in [A+n, A+n+m), and > > again after A+n+m > > > > > > In this case, the "last comitted revision" (according to 'svn status -v') > > differ: > > User A will get A+n+m > > User B will get A > > > > In practice, in our TeX Live main repository, when I do 'svn status -v' > > in my own checkout, I see: > > 45627 39121 karl Master/tlpkg/tlpsrc/collection-langgreek.tlpsrc > > and when I do it on our master checkout (the one that does the daily > > updates for TeX Live) I see: > > 45643 44192 karl Master/tlpkg/tlpsrc/collection-langgreek.tlpsrc > > (empty initial columns deleted). > > > > The second number here is -- according to 'svn status -h' -- > > The last committed revision and last committed author (with -v) > > ^^^^^^^^^^^^^^^^^^^^^^^ > > > > My assumption *was* that this is *consistent* across checkout, but it is > > not. > > It should be. > > I took a look at the TeXlive repository, specifically at that file. In > both cases, wheather the working copy revision (svn update -r X) is > 45627 or 45643, that file's last changed revision should be 44192. > > Here's the proof: > > $ svn info --show-item=last-changed-revision > svn://tug.org/texlive/trunk/Master/tlpkg/tlpsrc/collection-langgreek.tlpsrc > 44192 > > $ svn info --show-item=last-changed-revision > svn://tug.org/texlive/trunk/Master/tlpkg/tlpsrc/collection-langgreek.tlpsrc@45627 > 44192 > > > > > Is this an intended behavior? > > That depends on what you did. :) > > For example, what does `svnversion` say about your working copy? > Compared to the master? > > Unless this is a strange artefact of git-svn, I'd recommend an "svn > update" in your working copy ("your checkout," as you call it) and let's > see what happens. > > -- Brane >
It looks like a bug. The last-changed revision of the file is not
bumped even though it should be. It seems to be related to the
fact that the server does not send a delta for the file during
client B's update because the file's content is the same.
I can reproduce the problem with the attached script.
Below is the full output.
Note that the file 'alpha' is last-changed in revision 4 but has
an incorrect last-changed revision of r2 instead of r4:
4 2 stsp last-changed-rev/trunkB/alpha
The output changes if this line in the script:
echo change1 > $trunk/alpha # change back to content of r2
is changed to:
echo change3 > $trunk/alpha # change to other content
which results in a non-null delta on user B's update.
4 4 stsp last-changed-rev/trunkB/alpha
+ set -e
+ pwd
+ cwd=/tmp
+ basename last-changed-rev.sh .sh
+ scratch_area=last-changed-rev
+ repos=last-changed-rev/repos
+ trunk=last-changed-rev/trunk
+ branch=last-changed-rev/branch
+ trunk_url=file:////tmp/last-changed-rev/repos/trunk
+ branch_url=file:////tmp/last-changed-rev/repos/branch
+ set -x
+ rm -rf last-changed-rev
+ mkdir -p last-changed-rev
+ mkdir -p last-changed-rev/trunk
+ echo alpha
+ > last-changed-rev/trunk/alpha
+ svnadmin create /tmp/last-changed-rev/repos
+ svn import last-changed-rev/trunk file:////tmp/last-changed-rev/repos/trunk
-m importing project tree
Adding last-changed-rev/trunk/alpha
Committing transaction...
Committed revision 1.
+ rm -rf last-changed-rev/trunk
+ svn checkout file:////tmp/last-changed-rev/repos/trunk last-changed-rev/trunk
A last-changed-rev/trunk/alpha
Checked out revision 1.
+ svn checkout file:////tmp/last-changed-rev/repos/trunk last-changed-rev/trunkA
A last-changed-rev/trunkA/alpha
Checked out revision 1.
+ svn checkout file:////tmp/last-changed-rev/repos/trunk last-changed-rev/trunkB
A last-changed-rev/trunkB/alpha
Checked out revision 1.
+ echo change1
+ > last-changed-rev/trunk/alpha
+ svn ci last-changed-rev/trunk -m revision A: file xxx is changed
Sending last-changed-rev/trunk/alpha
Transmitting file data .done
Committing transaction...
Committed revision 2.
+ svn up last-changed-rev/trunkB
Updating 'last-changed-rev/trunkB':
U last-changed-rev/trunkB/alpha
Updated to revision 2.
+ echo change2
+ > last-changed-rev/trunk/alpha
+ svn ci last-changed-rev/trunk -m revision A+n: file xxx is changed again
Sending last-changed-rev/trunk/alpha
Transmitting file data .done
Committing transaction...
Committed revision 3.
+ svn up last-changed-rev/trunkA
Updating 'last-changed-rev/trunkA':
U last-changed-rev/trunkA/alpha
Updated to revision 3.
+ echo change1
+ > last-changed-rev/trunk/alpha
+ svn ci last-changed-rev/trunk -m revision A+n+m: file xxx is changed and
takes the same content as back in revision A
Sending last-changed-rev/trunk/alpha
Transmitting file data .done
Committing transaction...
Committed revision 4.
+ svn up last-changed-rev/trunkB
Updating 'last-changed-rev/trunkB':
At revision 4.
+ svn status -v last-changed-rev/trunkA
3 3 stsp last-changed-rev/trunkA
3 3 stsp last-changed-rev/trunkA/alpha
+ svn status -v last-changed-rev/trunkB
4 4 stsp last-changed-rev/trunkB
4 2 stsp last-changed-rev/trunkB/alpha
last-changed-rev.sh
Description: Bourne shell script
