|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
#!/usr/bin/perl
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
#
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# Update the local patches and RPM spec with patches from
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# an upstream tree with matching branch name.
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
#
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# For example
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
#
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# - Checkout upstream GIT repo for libvirt-sandbox
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# - Create a branch name matching current RHEL (eg rhel-6.4)
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# - Populate the branch by cherry-picking patches from master
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
#
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# This script will then
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
#
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# - Setup the upstream GIT repo as a remote named 'upstream'
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# - Extract version number from RPM spec
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# - Look for a tag 'v$VERSION' in upstream GIT
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# - Run 'git format-patches v$VERSION..upstream/rhel-6.4'
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# - Re-write the RPM spec to update all PatchNNN and %patchNNN lines
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
#
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
# The only manual step required is to fill in the changelog
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
#
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
use strict;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
use warnings;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
my $gitupstream = "git://libvirt.org/libvirt-sandbox.git";
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
my $rpmspec = "libvirt-sandbox.spec";
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
open SPEC, "$rpmspec" or die "cannot read $rpmspec: $!";
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
my @spec = <SPEC>;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
close SPEC;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
my $version;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
foreach my $line (@spec) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
if ($line =~ /^Version:\s*(\S+)\s*$/) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
$version = $1;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
die "cannot find Version: line in RPM spec"
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
unless $version;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
my $gittag = "v" . $version;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
my $gitbranch = $gittag . "-maint";
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
my $haveupstream;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
open GIT, "-|", "git", "remote" or die "cannot run git remote: $!";
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
while (<GIT>) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
if (/upstream/) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
$haveupstream = 1;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
close GIT;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
unless ($haveupstream) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
`git remote add upstream $gitupstream`;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
`git fetch upstream`;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
$haveupstream = 0;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
open GIT, "-|", "git", "branch", "-a" or die "cannot find git branch -a: $!";
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
while (<GIT>) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
if (m,upstream/$gitbranch,) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
$haveupstream = 1;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
close GIT;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
die "cannot find upstream/$gitbranch" unless $haveupstream;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
`git format-patch --no-signature -N $gittag..upstream/$gitbranch`;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
opendir DH, "." or die "cannot read current directory: $!";
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
my @patches
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
= grep {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
/^\d\d\d.*\.patch/
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
} readdir(DH);
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
closedir DH;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
@patches = sort @patches;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
open SPEC, ">$rpmspec" or die "cannot update $rpmspec: $!";
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
foreach my $line (@spec) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
print SPEC $line unless $line =~ /(Patch|%patch)/;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
my $i;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
if ($line =~ /Source0/) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
for ($i = 0 ; $i <= $#patches ; $i++) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
printf SPEC "Patch%d: %s\n", $i+1, $patches[$i];
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
} elsif ($line =~ /%setup/) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
for ($i = 0 ; $i <= $#patches ; $i++) {
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
printf SPEC "%%patch%d -p1\n", $i+1;
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
}
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
close SPEC or die "cannot save $rpmspec: $!";
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
|
|
![](https://seccdn.libravatar.org/avatar/0f8f8434e79f17ac67e6709c15c9c15f6f8894d3b72dfcf5789623403a6a9470?s=16&d=retro) |
d00b508 |
`git add *.patch $rpmspec`;
|