1#!/usr/bin/perl
2
3use strict;
4
5=head1 NAME
6
7Porting/manifest_lib.pl - functions for managing manifests
8
9=head1 SYNOPSIS
10
11    require './Porting/manifest_lib.pl';
12
13=head1 DESCRIPTION
14
15=head2 C<sort_manifest>
16
17Treats its arguments as (chomped) lines from a MANIFEST file, and returns that
18listed sorted appropriately.
19
20=cut
21
22# Try to get a sane sort. case insensitive, more or less
23# sorted such that path components are compared independently,
24# and so that lib/Foo/Bar sorts before lib/Foo-Alpha/Baz
25# and so that lib/Foo/Bar.pm sorts before lib/Foo/Bar/Alpha.pm
26# and so that configure and Configure sort together.
27sub sort_manifest {
28    return
29    # case insensitive sorting of directory components independently.
30    map { $_->[0] } # extract the full line
31    sort {
32        $a->[1] cmp $b->[1] || # sort in order of munged filename
33        $a->[0] cmp $b->[0]    # then by the exact text in full line
34    }
35    map {
36        # split out the filename and the description
37        my ($f) = split /\s+/, $_, 2;
38        # lc the filename so Configure and configure sort together in the list
39        my $m= lc $f; # $m for munged
40        # replace slashes by nulls, this makes short directory names sort before
41        # longer ones, such as "foo/" sorting before "foo-bar/"
42        $m =~ s!/!\0!g;
43        # replace the extension (only one) by null null extension.
44        # this puts any foo/blah.ext before any files in foo/blah/
45        $m =~ s!(\.[^.]+\z)!\0\0$1!;
46        # return the original string, and the munged filename
47        [ $_, $m ];
48    } @_;
49}
50
511;
52
53# ex: set ts=8 sts=4 sw=4 et:
54