-=| Jonathan Nieder, 19.11.2011 14:04:48 -0600 |=-
> Package: git
> Version: 1:1.7.2.5-2
> Tags: upstream fixed-upstream moreinfo
> X-Debbugs-Cc: Damyan Ivanov <dmn@debian.org>
>
> From [1]:
>
> > If you are working with multiple packages maintained by the Debian
> > Perl Group, then you will probably want to use mr(1) to manage the
> > multiple git repos involved. For this workflow, you'll need the
> > following packages installed:
> >
> > git (>= 1:1.7.5.4-1)
> >
> > The version in squeeze has buggy command_bidi_pipe method
>
> The fix is presumably v1.7.4.2~8^2 (perl: command_bidi_pipe() method
> should set-up git environmens, 2011-02-15). It would be nice to know
> what the symptoms in the motivating case are, in order to decide
> whether this fix ought to be included in a stable update.
Thanks for the offer! :)
It seems to me that is not critical for pkg-perl mr work-flow, though,
as the script that uses Git.pm (compare-hashes[1]) has a workaround --
it uses an embedded module (MY::Git), which descends from Git.pm and
adds two new methods for working with bidi pipes, supporting also
capturing of STDERR, and while there also fixing the missing
application of the git environment.
[1] http://anonscm.debian.org/gitweb/?p=pkg-perl/meta.git;f=compare-hashes
A stable fix would make this unnecessary (the STDERR capturing is not
used in our code anyway) and simplify our code. On the other hand, the
above documentation needs to be fixed regardless, as the git version
requirement is no longer true, as I see it.
Perhaps somebody from the Perl Group (CC-ed) could try this on
a squeeze system with the stock git package and confirm?
Here's the long story:
command_bidi_pipe() is used to launch any/custom git commands, feed
their STDIN and capture their STDOUT. The pkg-perl team needs this
functionality in a custom tool of ours, which is used as a 'skip' hook
for mr.
Let me elaborate. The problem we are facing is caused by the sheer
amount of repositories (2100+). With that many repositories, running
'mr up' is slow, no mater how many parallel jobs are started or if the
ssh connection is reused. Comparing the hashes of each repository just
takes time (most probably doe to great amount of disk seeks). We work
around this by keeping a special file on alioth, containing the hashes
of all the heads of all the repositories. The file is kept current by
PET via a post-receive hook.
So a 'mr up' first fetches that file with wget and splits it locally
for each repository. Then, when the skip hook is evaluated the hashes
of the local repository are compared with those from the retrieved
file, and the repository is skipped if everything matches.
Here comes command_bidi_pipe() -- it is used to run 'git cat-file
--batch-check' with all the retrieved hashes fed on STDIN and the
result retrieved from STDOUT. If all the remote hashes are present
locally, the repository is skipped.
The squeeze command_bidi_pipe didn't respect the environment given to
Git->repository(), so it was kind of unusable. One way around this
would be to set up %ENV before calling command_bidi_pipe, but I opted
for the solution in the start of this mail.
Cheers,
dam
Attachment:
signature.asc
Description: Digital signature