* James E Keenan <jk...@verizon.net> [2013-12-28 19:15]:
> At this point, the top-level directory merely contained the
> directories formerly found in ext/Pod-Html/. And 'git log' and 'git
> blame' indicated that the history had been preserved.

Except, at one time it had lived in lib/ and you are completely missing
that history. Yours effectively starts at the point where Nick moved it:
https://github.com/jkeenan/opodhtml/commit/75e62e6c1c6203daf034df38b525a6428d419b19
But you then have a couple of commits before that, at the beginning of
your local history… which are completely empty.

> git filter-branch --subdirectory-filter ext/Pod-Html/ -- --all

So first, make sure there are no useless commits:

    git filter-branch --prune-empty \
        --subdirectory-filter ext/Pod-Html/ -- --all

Next, you REALLY don’t want --all, which makes some 63 THOUSAND commits
that will take forEVER to process (hours). You want to look at only the
commits that touch relevant paths, which is some 530 total. On an SSD
that can be index-filtered in half a minute. MUCH better.

    git filter-branch --prune-empty \
        --subdirectory-filter ext/Pod-Html/ -- -- lib/Pod ext/Pod-Html

Note the double `--` – that is not a typo, the first `--` is for telling
git-filter-branch that the rest of the arguments are for git-rev-list,
so the second one gets passed through to git-rev-list, which takes it to
mean that only paths follow.

Next, since unfortunately --subdirectory-filter cannot extract multiple
directories at once, this job will need --index-filter.

    git filter-branch --prune-empty --index-filter '
        git rm --cached -r -q -- . ;
        git reset -q $GIT_COMMIT -- ext/Pod-Html/ lib/Pod/
    ' -- -- ext/Pod-Html/ lib/Pod/

The first line will clear out the index entirely. The next line restores
the relevant directories from the original commit undergoing rewriting.

Now comes the hard part, because lib/Pod/ alone is both too much (there
have been a number of other modules in there over time) as well as too
little (the relevant files used to be strewn all over the place before
there were consolidated into ext/Pod-Html/). This requires sleuthing.
I started with a full clone of perl5.git and did

    git log --name-status --full-diff -- ext/Pod-Html | egrep ^R

to find out all the files that were ever moved into ext/Pod-Html from
elsewhere:

    lib/Pod/Html.pm
    lib/Pod/t/eol.t
    lib/Pod/t/htmlescp.pod
    lib/Pod/t/htmlescp.t
    lib/Pod/t/htmllink.pod
    lib/Pod/t/htmllink.t
    lib/Pod/t/htmlview.pod
    lib/Pod/t/htmlview.t
    lib/Pod/t/pod2html-lib.pl
    pod/pod2html.PL

That’s not necessarily sufficient since those files may have chequered
histories of their own that may need tracking. E.g. it turns out that
pod/pod2html.PL had a predecessor called pod/pod2html.SH very early on,
which had been called pod/pod2html before even that. Are they relevant?
Maybe. In this case it turns out the answer is yes: they were not actual
shell scripts, but wrappers that generated a Perl pod2html script whose
code became the installed pod2html became the module plus stub script…
so you don’t want to miss them.

The other files turn out to be boring and obvious. (Thankfully!)

A potential complication is that Pod::Html used to load Pod::Functions.
But it turns out that it never actually used anything from that module…
as far as I can tell. So I’d take the easy way out: simply ignore that.

In the final analysis, you get this:

    export L='ext/Pod-Html/ lib/Pod/Html.pm ...' # all the files listed above
    git filter-branch --prune-empty --index-filter '
        git rm --cached -r -q -- . ;
        git reset -q $GIT_COMMIT -- $L
    ' -- -- $L

This extracts 287 commits from perl5.git, including the far beginning of
history. It leaves everything in the subdirectories it was in while it
was in perl5.git, but I figure that’s better here since the history of
splits and moves among files becomes unintelligible otherwise.

I’ve put up the result:

    https://github.com/ap/opodhtml

Feel free to clone that as a basis for the rest of your work.

I figure a commit that moves ext/Pod-Html/* to the root of the repo is
a clean cut to document “today begins the rest of life for this module”.
I have not done this, figuring I’ll leave it to you to do the honours.

(I want to get rid of that repo once it has served its purpose so please
let me know either way. If you do choose to use it, ideally, do not fork
it on GitHub (since that would record it as a fork), just git-clone it,
change the origin URL in to your existing GH repo, and force-push.)

-- 
Aristotle Pagaltzis // <http://plasmasturm.org/>

Reply via email to