Crear el Patch

Entonces procedemos a crear el patch usando el programa diff

pp2@nereida:/tmp$ diff -ur Algorithm-Knap01DP-0.01 Algorithm-Knap01DP-0.01.new/ > newknap.patch
La opción -u indica que usaremos formato unificado para la representación de las diferencias. Este es el formato mas usado en el intercambio de código entre desarrolladores.

La opción -r indica que queremos que se analizen toda la jerarquía de ficehros y directorios y se establezcan las diferencias entre ficheros, si estas existen. El fichero newknap.patch contiene una descripción de las diferencias entre la vieja y la nueva versión:

pp2@nereida:/tmp$ cat -n newknap.patch
 1  Sólo en Algorithm-Knap01DP-0.01.new/: blib
 2  diff -ur Algorithm-Knap01DP-0.01/lib/Algorithm/Knap01DP.pm Algorithm-Knap01DP-0.01.new/lib/Algorithm/Knap01DP.pm
 3  --- Algorithm-Knap01DP-0.01/lib/Algorithm/Knap01DP.pm   2005-05-20 07:40:28.000000000 +0100
 4  +++ Algorithm-Knap01DP-0.01.new/lib/Algorithm/Knap01DP.pm       2008-05-16 08:04:12.000000000 +0100
 5  @@ -4,6 +4,7 @@
 6   use warnings;
 7   use Carp;
 8   use IO::File;
 9  +use List::Util qw{first};
10
11   use Exporter;
12   our @ISA = qw(Exporter);
13  @@ -20,6 +21,7 @@
14     my @f;
15
16     croak "Profits and Weights don't have the same size" unless scalar(@w) == scalar(@p);
17  +  croak "Invalid weight/profit $_" if defined($_ = first { $_ <= 0 } (@w, @p));
18
19     for my $c (0..$M) {
20       $f[0][$c] = ($w[0] <= $c)? $p[0] : 0;
21  Sólo en Algorithm-Knap01DP-0.01.new/lib/Algorithm: Knap01DP.pm.original
22  Sólo en Algorithm-Knap01DP-0.01.new/lib/Algorithm: newknap.patch
23  Sólo en Algorithm-Knap01DP-0.01.new/: Makefile
24  Sólo en Algorithm-Knap01DP-0.01.new/: pm_to_blib
25  diff -ur Algorithm-Knap01DP-0.01/t/01MartelloAndTothBook.t Algorithm-Knap01DP-0.01.new/t/01MartelloAndTothBook.t
26  --- Algorithm-Knap01DP-0.01/t/01MartelloAndTothBook.t   2005-05-20 07:40:04.000000000 +0100
27  +++ Algorithm-Knap01DP-0.01.new/t/01MartelloAndTothBook.t       2008-05-16 07:55:17.000000000 +0100
28  @@ -3,7 +3,7 @@
29
30   #########################
31   use strict;
32  -use Test::More  tests => 11;
33  +use Test::More  tests => 12;
34
35   BEGIN { use_ok('Algorithm::Knap01DP', qw/Knap01DP ReadKnap/); }
36
37  @@ -39,6 +39,11 @@
38   eval { Knap01DP($M, $w, $p) };
39   like $@, qr/Profits and Weights don't have the same size/;
40
41  +# test to check when weights and profits have negative value
42  +$M = 100; @$w = @$p = (1,7,-2,3..8);
43  +eval { Knap01DP($M, $w, $p) };
44  +like $@, qr/Invalid weight/;
45  +
46   TODO: { # I plan to provide a function to find the vector solution ...
47     local $TODO = "Randomly generated problem";
48     can_ok('Algorithm::Knap01DP', 'GenKnap');
La cabecera
 2  diff -ur Algorithm-Knap01DP-0.01/lib/Algorithm/Knap01DP.pm Algorithm-Knap01DP-0.01.new/lib/Algorithm/Knap01DP.pm
 3  --- Algorithm-Knap01DP-0.01/lib/Algorithm/Knap01DP.pm   2005-05-20 07:40:28.000000000 +0100
 4  +++ Algorithm-Knap01DP-0.01.new/lib/Algorithm/Knap01DP.pm       2008-05-16 08:04:12.000000000 +0100
indica que las diferencias que siguen se refieren a los ficheros Knap01DP.pm.

Un rango como @@ -4,6 +4,7 @@ establece un trozo que ha cambiado. Nos indica que las líneas de la 4 a la 4+6 del original han sido cambiadas por las líneas de la 4 a la 4+7 en el nuevo. La presencia del prefijo + indica que se ha insertado una nueva línea:

+use List::Util qw{first};

Las restantes líneas son 'de contexto'.

Otro trozo que ha cambiado es @@ -20,6 +21,7 @@

17  +  croak "Invalid weight/profit $_" if defined($_ = first { $_ <= 0 } (@w, @p));

Otro fichero que ha cambiado es 01MartelloAndTothBook.t:

25  diff -ur Algorithm-Knap01DP-0.01/t/01MartelloAndTothBook.t Algorithm-Knap01DP-0.01.new/t/01MartelloAndTothBook.t
26  --- Algorithm-Knap01DP-0.01/t/01MartelloAndTothBook.t   2005-05-20 07:40:04.000000000 +0100
27  +++ Algorithm-Knap01DP-0.01.new/t/01MartelloAndTothBook.t       2008-05-16 07:55:17.000000000 +0100
El trozo:
28  @@ -3,7 +3,7 @@
29
30   #########################
31   use strict;
32  -use Test::More  tests => 11;
33  +use Test::More  tests => 12;
34
35   BEGIN { use_ok('Algorithm::Knap01DP', qw/Knap01DP ReadKnap/); }
indica que se cambió la línea use Test::More tests => 11; por use Test::More tests => 12; Parece que se ha añadido una prueba. En efecto, vemos que se han insertado 5 nuevas líneas que comprueban el buen funcionamiento de la función Knap01DP cuando se le pasan pesos/beneficios negativos:
37  @@ -39,6 +39,11 @@
38   eval { Knap01DP($M, $w, $p) };
39   like $@, qr/Profits and Weights don't have the same size/;
40
41  +# test to check when weights and profits have negative value
42  +$M = 100; @$w = @$p = (1,7,-2,3..8);
43  +eval { Knap01DP($M, $w, $p) };
44  +like $@, qr/Invalid weight/;
45  +
46   TODO: { # I plan to provide a function to find the vector solution ...
47     local $TODO = "Randomly generated problem";
48     can_ok('Algorithm::Knap01DP', 'GenKnap');

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19