[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Repository follies

From: Eric S. Raymond
Subject: Repository follies
Date: Thu, 13 Feb 2014 18:49:38 -0500 (EST)

I have unscrambled the mess made by up-converting a bunch of RCS files
into CVS about as much as is possible.  I've figured out which
=-prefixed attic files need to be renamed and in a couple of places where 
the real deletion points were.  

Finding those deletion points turns out to be quite hard to
do in general.  I've just added an extension to reposurgeon that
allows it to run custom Python procedures with full access to the
deserialized data structures inside the tool; I may try writing a crawler 
that mines the Changelog files looking for final mentions.

While doing this, I ran across some weird artifacts.  There is a whole
series of commits that modify both rcslog and =rcslog, pointing to
identical blobs for both.  The fix (dropping the =rcslog fileops) is
clear enough.

There's one small group of commits that's even weirder.

1992-04-19T08:53:address@hidden Makefile.in :1743 :1737
1992-12-06T22:12:address@hidden Makefile.in :5094 :5092
1993-01-26T01:58:address@hidden Makefile.in :5479 :5455

These three commits contain fileops for Makefile.in and =Makefile.in
*pointing to different blobs*.  I wrote the custom-code extension
because I had a dark suspicion things like this might exist and wanted
to be able to write code to find them. Here's what the crawler code
looks like:

# This is a reposurgeon script that sanity-checks a property of the Emacs repo.
# It is expected that stripped.fi was produced by stripping blobs out of
# attic.fi to preserve the structure.

read <stripped.fi

exec <<EOF

def sanecheck(repository, selection):
    for i in selection:
        event = repository.events[i]
        for fileop1 in event.fileops:
            if fileop1.op == 'M':
                base1 = fileop1.path.split('/')[-1]
                if base1.startswith('='):
                    for fileop2 in event.fileops:
                        if fileop2.op == 'M':
                           base2 = fileop2.path.split('/')[-1]
                           if base2 == base1[1:]:
                               if fileop1.ref != fileop2.ref:
                                   print("%s %s %s %s" % 
(event.committer.action_stamp(), fileop2.path, fileop1.ref, fileop2.ref))

=C eval sanecheck(_repository,_selection)

How those attic versions of Makefile.in persisted alongside it I don't
know. Why Makefile.in got deleted in RCS in the first place I don't
know - that was probably sonmeone's slip of the hand.  How
=Makefile.in ended up with modification fileops after the deletion
point I don't know. 

I suspect some of this, maybe all, was damage done at the time of
conversion to CVS. Say it with me: most repository conversion tools

Again, the right thing to do is clearly just to drop the fileops 
for the attic files. I'm griping about this mainly because I want
interested parties to be fully aware that there is nasty stuff back
there in the RCS and CVS parts of the history.  Reconstructing 
a clean set of changes that expresses the intentions of people
hacking at the time is hard work.

Speaking of hard work, I lost four days in the last week to a power
outage caused by Storm Nika.  Had to dig my way out of 14 inches 
of Storm Pax this morning.  And more snow is due tonight, my kung fu
class got cancelled dammit.  Means I'll have more time to work on this.

Back to the Augean stables...
                <a href="http://www.catb.org/~esr/";>Eric S. Raymond</a>

"I hold it, that a little rebellion, now and then, is a good thing, and as 
necessary in the political world as storms in the physical."
        -- Thomas Jefferson, Letter to James Madison, January 30, 1787

reply via email to

[Prev in Thread] Current Thread [Next in Thread]