Changeset 395 in ProjectBuilder for devel/pb/bin
- Timestamp:
- Apr 18, 2008, 7:32:09 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
devel/pb/bin/pb
r383 r395 17 17 use File::Basename; 18 18 use File::Copy; 19 use File::Path; 20 use File::stat; 21 use File::Temp qw(tempdir); 22 use Date::Manip; 19 23 use Time::localtime qw(localtime); 20 24 use POSIX qw(strftime); 25 21 26 22 27 # Global variables … … 1646 1651 -output => $filehandle } ); 1647 1652 } 1653 1654 sub pb_env_init { 1655 1656 my $proj=shift || undef; 1657 my $pbinit=shift || undef; 1658 my $action=shift; 1659 my $ver; 1660 my $tag; 1661 1662 $ENV{'PBETC'} = "$ENV{'HOME'}/.pbrc"; 1663 1664 # 1665 # Check project name 1666 # Could be with env var PBPROJ 1667 # or option -p 1668 # if not define take the first in conf file 1669 # 1670 if ((defined $ENV{'PBPROJ'}) && 1671 (not (defined $proj))) { 1672 $proj = $ENV{'PBPROJ'}; 1673 } 1674 1675 # 1676 # We get the pbconf file for that project 1677 # and use its content 1678 # 1679 my ($pbconf) = pb_conf_read("$ENV{'PBETC'}","pbconfurl"); 1680 pb_log(2,"DEBUG pbconfurl: ".Dumper($pbconf)."\n"); 1681 1682 my %pbconf = %$pbconf; 1683 if (not defined $proj) { 1684 # Take the first as the default project 1685 $proj = (keys %pbconf)[0]; 1686 if (defined $proj) { 1687 pb_log(1,"WARNING: using $proj as default project as none has been specified\n"); 1688 pb_log(1," Please either create a pbconfurl reference for project $proj in $ENV{'PBETC'}\n"); 1689 pb_log(1," or call pb with the -p project option or use the env var PBPROJ\n"); 1690 pb_log(1," if you want to use another project\n"); 1691 } 1692 } 1693 die "No project defined - use env var PBPROJ or -p proj or a pbconfurl entry in $ENV{'PBETC'}" if (not (defined $proj)); 1694 1695 # That's always the environment variable that will be used 1696 $ENV{'PBPROJ'} = $proj; 1697 pb_log(2,"PBPROJ: $ENV{'PBPROJ'}\n"); 1698 1699 if (not defined ($pbconf{$ENV{'PBPROJ'}})) { 1700 die "Please create a pbconfurl reference for project $ENV{'PBPROJ'} in $ENV{'PBETC'}\n"; 1701 } 1702 1703 # 1704 # Detect the root dir for hosting all the content generated with pb 1705 # 1706 # Tree will look like this: 1707 # 1708 # maint pbdefdir PBDEFDIR dev dir (optional) 1709 # | | 1710 # ------------------------ -------------------- 1711 # | | | | 1712 # pbproj1 pbproj2 PBPROJ pbproj1 pbproj2 PBPROJDIR 1713 # | | 1714 # --------------------------------------------- ---------- 1715 # * * * | | | * * 1716 # tag dev pbconf ... build delivery PBCONFDIR dev tag 1717 # | | | PBDESTDIR | 1718 # --- ------ pbrc PBBUILDDIR ------- 1719 # | | | | | 1720 # 1.1 dev tag 1.0 1.1 PBDIR 1721 # | 1722 # ------- 1723 # | | 1724 # 1.0 1.1 PBROOTDIR 1725 # | 1726 # ---------------------------------- 1727 # | | | | 1728 # pkg1 pbproj1.pb pbfilter pbcl 1729 # | 1730 # ----------------- 1731 # | | | 1732 # rpm deb pbfilter 1733 # 1734 # 1735 # (*) By default, if no relocation in .pbrc, dev dir is taken in the maint pbdefdir (when appropriate) 1736 # Names under a pbproj and the corresponding pbconf should be similar 1737 # 1738 1739 my ($pbdefdir) = pb_conf_get_if("pbdefdir"); 1740 1741 if (not defined $ENV{'PBDEFDIR'}) { 1742 if ((not defined $pbdefdir) || (not defined $pbdefdir->{$ENV{'PBPROJ'}})) { 1743 pb_log(1,"WARNING: no pbdefdir defined, using /var/cache\n"); 1744 pb_log(1," Please create a pbdefdir reference for project $ENV{'PBPROJ'} in $ENV{'PBETC'}\n"); 1745 pb_log(1," if you want to use another directory\n"); 1746 $ENV{'PBDEFDIR'} = "/var/cache"; 1747 } else { 1748 # That's always the environment variable that will be used 1749 $ENV{'PBDEFDIR'} = $pbdefdir->{$ENV{'PBPROJ'}}; 1750 } 1751 } 1752 # Expand potential env variable in it 1753 eval { $ENV{'PBDEFDIR'} =~ s/(\$ENV.+\})/$1/eeg }; 1754 1755 pb_log(2,"PBDEFDIR: $ENV{'PBDEFDIR'}\n"); 1756 # 1757 # Set delivery directory 1758 # 1759 $ENV{'PBDESTDIR'}="$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}/delivery"; 1760 1761 pb_log(2,"PBDESTDIR: $ENV{'PBDESTDIR'}\n"); 1762 # 1763 # Removes all directory existing below the delivery dir 1764 # as they are temp dir only 1765 # Files stay and have to be cleaned up manually if needed 1766 # those files serves as communication channels between pb phases 1767 # Removing them prevents a following phase to detect what has been done before 1768 # 1769 if (-d $ENV{'PBDESTDIR'}) { 1770 opendir(DIR,$ENV{'PBDESTDIR'}) || die "Unable to open directory $ENV{'PBDESTDIR'}: $!"; 1771 foreach my $d (readdir(DIR)) { 1772 next if ($d =~ /^\./); 1773 next if (-f "$ENV{'PBDESTDIR'}/$d"); 1774 pb_rm_rf("$ENV{'PBDESTDIR'}/$d") if (-d "$ENV{'PBDESTDIR'}/$d"); 1775 } 1776 closedir(DIR); 1777 } 1778 if (! -d "$ENV{'PBDESTDIR'}") { 1779 pb_mkdir_p($ENV{'PBDESTDIR'}) || die "Unable to recursively create $ENV{'PBDESTDIR'}"; 1780 } 1781 1782 # 1783 # Set build directory 1784 # 1785 $ENV{'PBBUILDDIR'}="$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}/build"; 1786 if (! -d "$ENV{'PBBUILDDIR'}") { 1787 pb_mkdir_p($ENV{'PBBUILDDIR'}) || die "Unable to recursively create $ENV{'PBBUILDDIR'}"; 1788 } 1789 1790 pb_log(2,"PBBUILDDIR: $ENV{'PBBUILDDIR'}\n"); 1791 # 1792 # Set temp directory 1793 # 1794 if (not defined $ENV{'TMPDIR'}) { 1795 $ENV{'TMPDIR'}="/tmp"; 1796 } 1797 $ENV{'PBTMP'} = tempdir( "pb.XXXXXXXXXX", DIR => $ENV{'TMPDIR'}, CLEANUP => 1 ); 1798 pb_log(2,"PBTMP: $ENV{'PBTMP'}\n"); 1799 1800 # 1801 # The following part is only useful when in cms2something of newver 1802 # In VMs/VEs we want to skip that by providing good env vars. 1803 # return values in that case are useless 1804 # 1805 if (($action =~ /^cms2/) || ($action =~ /^newver$/)) { 1806 1807 # 1808 # Check pbconf cms compliance 1809 # 1810 pb_cms_compliant("pbconfdir",'PBCONFDIR',"$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}/pbconf",$pbconf{$ENV{'PBPROJ'}},$pbinit); 1811 1812 # Check where is our PBROOTDIR (release tag name can't be guessed the first time) 1813 # 1814 if (not defined $ENV{'PBROOTDIR'}) { 1815 if (! -f ("$ENV{'PBDESTDIR'}/pbrc")) { 1816 opendir(DIR,$ENV{'PBCONFDIR'}) || die "Unable to open directory $ENV{'PBCONFDIR'}: $!"; 1817 my $maxmtime = 0; 1818 foreach my $d (readdir(DIR)) { 1819 pb_log(3,"Looking at \'$d\'..."); 1820 next if ($d =~ /^\./); 1821 next if (! -d "$ENV{'PBCONFDIR'}/$d"); 1822 my $s = stat("$ENV{'PBCONFDIR'}/$d"); 1823 next if (not defined $s); 1824 pb_log(3,"KEEP\n"); 1825 # Keep the most recent 1826 pb_log(2," $s->mtime\n"); 1827 if ($s->mtime > $maxmtime) { 1828 $ENV{'PBROOTDIR'} = "$ENV{'PBCONFDIR'}/$d"; 1829 $maxmtime = $s->mtime; 1830 } 1831 } 1832 closedir(DIR); 1833 die "No directory found under $ENV{'PBCONFDIR'}" if (not defined $ENV{'PBROOTDIR'}); 1834 pb_log(1,"WARNING: no pbroot defined, using $ENV{'PBROOTDIR'}\n"); 1835 pb_log(1," Please use -r release if you want to use another release\n"); 1836 } else { 1837 my ($pbroot) = pb_conf_read_if("$ENV{'PBDESTDIR'}/pbrc","pbroot"); 1838 # That's always the environment variable that will be used 1839 die "Please remove inconsistent $ENV{'PBDESTDIR'}/pbrc" if ((not defined $pbroot) || (not defined $pbroot->{$ENV{'PBPROJ'}})); 1840 $ENV{'PBROOTDIR'} = $pbroot->{$ENV{'PBPROJ'}}; 1841 } 1842 } else { 1843 # transform in full path if relative 1844 $ENV{'PBROOTDIR'} = "$ENV{'PBCONFDIR'}/$ENV{'PBROOTDIR'}" if ($ENV{'PBROOTDIR'} !~ /^\//); 1845 pb_mkdir_p($ENV{'PBROOTDIR'}) if (defined $pbinit); 1846 die "$ENV{'PBROOTDIR'} is not a directory" if (not -d $ENV{'PBROOTDIR'}); 1847 } 1848 1849 return if ($action =~ /^newver$/); 1850 1851 my %version = (); 1852 my %defpkgdir = (); 1853 my %extpkgdir = (); 1854 my %filteredfiles = (); 1855 my %supfiles = (); 1856 1857 if ((-f "$ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb") and (not defined $pbinit)) { 1858 # List of pkg to build by default (mandatory) 1859 my ($defpkgdir,$pbpackager, $pkgv, $pkgt) = pb_conf_get("defpkgdir","pbpackager","projver","projtag"); 1860 # List of additional pkg to build when all is called (optional) 1861 # Valid version names (optional) 1862 # List of files to filter (optional) 1863 # Project version and tag (optional) 1864 my ($extpkgdir, $version, $filteredfiles, $supfiles) = pb_conf_get_if("extpkgdir","version","filteredfiles","supfiles"); 1865 pb_log(2,"DEBUG: defpkgdir: ".Dumper($defpkgdir)."\n"); 1866 pb_log(2,"DEBUG: extpkgdir: ".Dumper($extpkgdir)."\n"); 1867 pb_log(2,"DEBUG: version: ".Dumper($version)."\n"); 1868 pb_log(2,"DEBUG: filteredfiles: ".Dumper($filteredfiles)."\n"); 1869 pb_log(2,"DEBUG: supfiles: ".Dumper($supfiles)."\n"); 1870 # Global 1871 %defpkgdir = %$defpkgdir; 1872 %extpkgdir = %$extpkgdir if (defined $extpkgdir); 1873 %version = %$version if (defined $version); 1874 %filteredfiles = %$filteredfiles if (defined $filteredfiles); 1875 %supfiles = %$supfiles if (defined $supfiles); 1876 # 1877 # Get global Version/Tag 1878 # 1879 if (not defined $ENV{'PBPROJVER'}) { 1880 if ((defined $pkgv) && (defined $pkgv->{$ENV{'PBPROJ'}})) { 1881 $ENV{'PBPROJVER'}=$pkgv->{$ENV{'PBPROJ'}}; 1882 } else { 1883 die "No projver found in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb"; 1884 } 1885 } 1886 die "Invalid version name $ENV{'PBPROJVER'} in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb" if (($ENV{'PBPROJVER'} !~ /[0-9.]+/) && (not defined $version) && ($ENV{'PBPROJVER'} =~ /$version{$ENV{'PBPROJ'}}/)); 1887 1888 if (not defined $ENV{'PBPROJTAG'}) { 1889 if ((defined $pkgt) && (defined $pkgt->{$ENV{'PBPROJ'}})) { 1890 $ENV{'PBPROJTAG'}=$pkgt->{$ENV{'PBPROJ'}}; 1891 } else { 1892 die "No projtag found in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb"; 1893 } 1894 } 1895 die "Invalid tag name $ENV{'PBPROJTAG'} in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb" if ($ENV{'PBPROJTAG'} !~ /[0-9.]+/); 1896 1897 1898 if (not defined $ENV{'PBPACKAGER'}) { 1899 if ((defined $pbpackager) && (defined $pbpackager->{$ENV{'PBPROJ'}})) { 1900 $ENV{'PBPACKAGER'}=$pbpackager->{$ENV{'PBPROJ'}}; 1901 } else { 1902 die "No pbpackager found in $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb"; 1903 } 1904 } 1905 } else { 1906 if (defined $pbinit) { 1907 my $ptr = pb_get_pkg(); 1908 my @pkgs = @$ptr; 1909 @pkgs = ("pkg1") if (not @pkgs); 1910 1911 open(CONF,"> $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb") || die "Unable to create $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb"; 1912 print CONF << "EOF"; 1913 # 1914 # Project Builder configuration file 1915 # For project $ENV{'PBPROJ'} 1916 # 1917 # \$Id\$ 1918 # 1919 1920 # 1921 # What is the project URL 1922 # 1923 #pburl $ENV{'PBPROJ'} = svn://svn.$ENV{'PBPROJ'}.org/$ENV{'PBPROJ'}/devel 1924 #pburl $ENV{'PBPROJ'} = svn://svn+ssh.$ENV{'PBPROJ'}.org/$ENV{'PBPROJ'}/devel 1925 #pburl $ENV{'PBPROJ'} = cvs://cvs.$ENV{'PBPROJ'}.org/$ENV{'PBPROJ'}/devel 1926 #pburl $ENV{'PBPROJ'} = http://www.$ENV{'PBPROJ'}.org/src/$ENV{'PBPROJ'}-devel.tar.gz 1927 #pburl $ENV{'PBPROJ'} = ftp://ftp.$ENV{'PBPROJ'}.org/src/$ENV{'PBPROJ'}-devel.tar.gz 1928 #pburl $ENV{'PBPROJ'} = file:///src/$ENV{'PBPROJ'}-devel.tar.gz 1929 #pburl $ENV{'PBPROJ'} = dir:///src/$ENV{'PBPROJ'}-devel 1930 1931 # Check whether project is well formed 1932 # (containing already a directory with the project-version name) 1933 #pbwf $ENV{'PBPROJ'} = 1 1934 1935 # 1936 # Packager label 1937 # 1938 #pbpackager $ENV{'PBPROJ'} = William Porte <bill\@$ENV{'PBPROJ'}.org> 1939 # 1940 1941 # For delivery to a machine by SSH (potentially the FTP server) 1942 # Needs hostname, account and directory 1943 # 1944 #sshhost $ENV{'PBPROJ'} = www.$ENV{'PBPROJ'}.org 1945 #sshlogin $ENV{'PBPROJ'} = bill 1946 #sshdir $ENV{'PBPROJ'} = /$ENV{'PBPROJ'}/ftp 1947 #sshport $ENV{'PBPROJ'} = 22 1948 1949 # 1950 # For Virtual machines management 1951 # Naming convention to follow: distribution name (as per ProjectBuilder::Distribution) 1952 # followed by '-' and by release number 1953 # followed by '-' and by architecture 1954 # a .vmtype extension will be added to the resulting string 1955 # a QEMU rhel-3-i286 here means that the VM will be named rhel-3-i386.qemu 1956 # 1957 #vmlist $ENV{'PBPROJ'} = mandrake-10.1-i386,mandrake-10.2-i386,mandriva-2006.0-i386,mandriva-2007.0-i386,mandriva-2007.1-i386,mandriva-2008.0-i386,redhat-7.3-i386,redhat-9-i386,fedora-4-i386,fedora-5-i386,fedora-6-i386,fedora-7-i386,fedora-8-i386,rhel-3-i386,rhel-4-i386,rhel-5-i386,suse-10.0-i386,suse-10.1-i386,suse-10.2-i386,suse-10.3-i386,sles-9-i386,sles-10-i386,gentoo-nover-i386,debian-3.1-i386,debian-4.0-i386,ubuntu-6.06-i386,ubuntu-7.04-i386,ubuntu-7.10-i386,mandriva-2007.0-x86_64,mandriva-2007.1-x86_64,mandriva-2008.0-x86_64,fedora-6-x86_64,fedora-7-x86_64,fedora-8-x86_64,rhel-4-x86_64,rhel-5-x86_64,suse-10.2-x86_64,suse-10.3-x86_64,sles-10-x86_64,gentoo-nover-x86_64,debian-4.0-x86_64,ubuntu-7.04-x86_64,ubuntu-7.10-x86_64 1958 1959 # 1960 # Valid values for vmtype are 1961 # qemu, (vmware, xen, ... TBD) 1962 #vmtype $ENV{'PBPROJ'} = qemu 1963 1964 # Hash for VM stuff on vmtype 1965 #vmntp default = pool.ntp.org 1966 1967 # We suppose we can commmunicate with the VM through SSH 1968 #vmhost $ENV{'PBPROJ'} = localhost 1969 #vmlogin $ENV{'PBPROJ'} = pb 1970 #vmport $ENV{'PBPROJ'} = 2222 1971 1972 # Timeout to wait when VM is launched/stopped 1973 #vmtmout default = 120 1974 1975 # per VMs needed paramaters 1976 #vmopt $ENV{'PBPROJ'} = -m 384 -daemonize 1977 #vmpath $ENV{'PBPROJ'} = /home/qemu 1978 #vmsize $ENV{'PBPROJ'} = 5G 1979 1980 # 1981 # For Virtual environment management 1982 # Naming convention to follow: distribution name (as per ProjectBuilder::Distribution) 1983 # followed by '-' and by release number 1984 # followed by '-' and by architecture 1985 # a .vetype extension will be added to the resulting string 1986 # a chroot rhel-3-i286 here means that the VE will be named rhel-3-i386.chroot 1987 # 1988 #velist $ENV{'PBPROJ'} = fedora-7-i386 1989 1990 # VE params 1991 #vetype $ENV{'PBPROJ'} = chroot 1992 #ventp default = pool.ntp.org 1993 #velogin $ENV{'PBPROJ'} = pb 1994 #vepath $ENV{'PBPROJ'} = /var/lib/mock 1995 #veconf $ENV{'PBPROJ'} = /etc/mock 1996 #verebuild $ENV{'PBPROJ'} = false 1997 1998 # 1999 # Global version/tag for the project 2000 # 2001 #projver $ENV{'PBPROJ'} = devel 2002 #projtag $ENV{'PBPROJ'} = 1 2003 2004 # Hash of valid version names 2005 #version $ENV{'PBPROJ'} = devel,stable 2006 2007 # Adapt to your needs: 2008 # Optional if you need to overwrite the global values above 2009 # 2010 EOF 2011 2012 foreach my $pp (@pkgs) { 2013 print CONF << "EOF"; 2014 #pkgver $pp = stable 2015 #pkgtag $pp = 3 2016 EOF 2017 } 2018 foreach my $pp (@pkgs) { 2019 print CONF << "EOF"; 2020 # Hash of default package/package directory 2021 #defpkgdir $pp = dir-$pp 2022 EOF 2023 } 2024 2025 print CONF << "EOF"; 2026 # Hash of additional package/package directory 2027 #extpkgdir minor-pkg = dir-minor-pkg 2028 2029 # List of files per pkg on which to apply filters 2030 # Files are mentioned relatively to pbroot/defpkgdir 2031 EOF 2032 foreach my $pp (@pkgs) { 2033 print CONF << "EOF"; 2034 #filteredfiles $pp = Makefile.PL,configure.in,install.sh,$pp.8 2035 #supfiles $pp = $pp.init 2036 EOF 2037 } 2038 close(CONF); 2039 pb_mkdir_p("$ENV{'PBROOTDIR'}/pbfilter") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter"; 2040 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/all.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/all.pbf"; 2041 print CONF << "EOF"; 2042 # 2043 # \$Id\$ 2044 # 2045 # Filter for all files 2046 # 2047 # PBSRC is replaced by the source package format 2048 #filter PBSRC = ftp://ftp.$ENV{'PBPROJ'}.org/src/%{name}-%{version}.tar.gz 2049 2050 # PBVER is replaced by the version (\$pbver in code) 2051 filter PBVER = \$pbver 2052 2053 # PBDATE is replaced by the date (\$pbdate in code) 2054 filter PBDATE = \$pbdate 2055 2056 # PBLOG is replaced by the changelog if value is yes 2057 #filter PBLOG = yes 2058 2059 # PBTAG is replaced by the tag (\$pbtag in code) 2060 filter PBTAG = \$pbtag 2061 2062 # PBREV is replaced by the revision (\$pbrev in code) 2063 filter PBREV = \$pbrev 2064 2065 # PBPKG is replaced by the package name (\$pbpkg in code) 2066 filter PBPKG = \$pbpkg 2067 2068 # PBPACKAGER is replaced by the packager name (\$pbpackager in code) 2069 filter PBPACKAGER = \$pbpackager 2070 2071 # PBDESC contains the description of the package 2072 #filter PBDESC = "Bla-Bla" 2073 2074 # PBURL contains the URL of the Web site of the project 2075 #filter PBURL = http://www.$ENV{'PBPROJ'}.org 2076 EOF 2077 close(CONF); 2078 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/rpm.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/rpm.pbf"; 2079 print CONF << "EOF"; 2080 # 2081 # \$Id\$ 2082 # 2083 # Filter for rpm build 2084 # 2085 2086 # PBGRP is replaced by the RPM group of apps 2087 # Cf: http://fedoraproject.org/wiki/RPMGroups 2088 #filter PBGRP = Applications/Archiving 2089 2090 # PBLIC is replaced by the license of the application 2091 # Cf: http://fedoraproject.org/wiki/Licensing 2092 #filter PBLIC = GPL 2093 2094 # PBDEP is replaced by the list of dependencies 2095 #filter PBDEP = 2096 2097 # PBSUF is replaced by the package suffix (\$pbsuf in code) 2098 filter PBSUF = \$pbsuf 2099 2100 # PBOBS is replaced by the Obsolete line 2101 #filter PBOBS = 2102 2103 EOF 2104 close(CONF); 2105 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/deb.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/deb.pbf"; 2106 print CONF << "EOF"; 2107 # 2108 # \$Id\$ 2109 # 2110 # Filter for debian build 2111 # 2112 # PBGRP is replaced by the group of apps 2113 filter PBGRP = utils 2114 2115 # PBLIC is replaced by the license of the application 2116 # Cf: 2117 #filter PBLIC = GPL 2118 2119 # PBDEP is replaced by the list of dependencies 2120 #filter PBDEP = 2121 2122 # PBSUG is replaced by the list of suggestions 2123 #filter PBSUG = 2124 2125 # PBREC is replaced by the list of recommandations 2126 #filter PBREC = 2127 2128 EOF 2129 close(CONF); 2130 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/md.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/md.pbf"; 2131 print CONF << "EOF"; 2132 # Specific group for Mandriva for $ENV{'PBPROJ'} 2133 # Cf: http://wiki.mandriva.com/en/Development/Packaging/Groups 2134 #filter PBGRP = Archiving/Backup 2135 2136 # PBLIC is replaced by the license of the application 2137 # Cf: http://wiki.mandriva.com/en/Development/Packaging/Licenses 2138 #filter PBLIC = GPL 2139 2140 EOF 2141 close(CONF); 2142 open(CONF,"> $ENV{'PBROOTDIR'}/pbfilter/novell.pbf") || die "Unable to create $ENV{'PBROOTDIR'}/pbfilter/novell.pbf"; 2143 print CONF << "EOF"; 2144 # Specific group for SuSE for $ENV{'PBPROJ'} 2145 # Cf: http://en.opensuse.org/SUSE_Package_Conventions/RPM_Groups 2146 #filter PBGRP = Productivity/Archiving/Backup 2147 2148 # PBLIC is replaced by the license of the application 2149 # Cf: http://en.opensuse.org/Packaging/SUSE_Package_Conventions/RPM_Style#1.6._License_Tag 2150 #filter PBLIC = GPL 2151 2152 EOF 2153 close(CONF); 2154 foreach my $pp (@pkgs) { 2155 pb_mkdir_p("$ENV{'PBROOTDIR'}/$pp/deb") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb"; 2156 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/control") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/control"; 2157 print CONF << "EOF"; 2158 Source: PBPKG 2159 Section: PBGRP 2160 Priority: optional 2161 Maintainer: PBPACKAGER 2162 Build-Depends: debhelper (>= 4.2.20), PBDEP 2163 Standards-Version: 3.6.1 2164 2165 Package: PBPKG 2166 Architecture: amd64 i386 ia64 2167 Section: PBGRP 2168 Priority: optional 2169 Depends: \${shlibs:Depends}, \${misc:Depends}, PBDEP 2170 Recommends: PBREC 2171 Suggests: PBSUG 2172 Description: 2173 PBDESC 2174 . 2175 Homepage: PBURL 2176 2177 EOF 2178 close(CONF); 2179 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/copyright") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/copyright"; 2180 print CONF << "EOF"; 2181 This package is debianized by PBPACKAGER 2182 `date` 2183 2184 The current upstream source was downloaded from 2185 ftp://ftp.$ENV{'PBPROJ'}.org/src/. 2186 2187 Upstream Authors: Put their name here 2188 2189 Copyright: 2190 2191 This package is free software; you can redistribute it and/or modify 2192 it under the terms of the GNU General Public License as published by 2193 the Free Software Foundation; version 2 dated June, 1991. 2194 2195 This package is distributed in the hope that it will be useful, 2196 but WITHOUT ANY WARRANTY; without even the implied warranty of 2197 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 2198 GNU General Public License for more details. 2199 2200 You should have received a copy of the GNU General Public License 2201 along with this package; if not, write to the Free Software 2202 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 2203 MA 02110-1301, USA. 2204 2205 On Debian systems, the complete text of the GNU General 2206 Public License can be found in /usr/share/common-licenses/GPL. 2207 2208 EOF 2209 close(CONF); 2210 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/changelog") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/changelog"; 2211 print CONF << "EOF"; 2212 PBLOG 2213 EOF 2214 close(CONF); 2215 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/compat") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/compat"; 2216 print CONF << "EOF"; 2217 4 2218 EOF 2219 close(CONF); 2220 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/$pp.dirs") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/$pp.dirs"; 2221 print CONF << "EOF"; 2222 EOF 2223 close(CONF); 2224 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/$pp.docs") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/$pp.docs"; 2225 print CONF << "EOF"; 2226 INSTALL 2227 COPYING 2228 AUTHORS 2229 NEWS 2230 README 2231 EOF 2232 close(CONF); 2233 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/deb/rules") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/deb/rules"; 2234 print CONF << 'EOF'; 2235 #!/usr/bin/make -f 2236 # -*- makefile -*- 2237 # Sample debian/rules that uses debhelper. 2238 # GNU copyright 1997 to 1999 by Joey Hess. 2239 # 2240 # $Id$ 2241 # 2242 2243 # Uncomment this to turn on verbose mode. 2244 #export DH_VERBOSE=1 2245 2246 # Define package name variable for a one-stop change. 2247 PACKAGE_NAME = PBPKG 2248 2249 # These are used for cross-compiling and for saving the configure script 2250 # from having to guess our platform (since we know it already) 2251 DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) 2252 DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) 2253 2254 CFLAGS = -Wall -g 2255 2256 ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) 2257 CFLAGS += -O0 2258 else 2259 CFLAGS += -O2 2260 endif 2261 ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) 2262 INSTALL_PROGRAM += -s 2263 endif 2264 config.status: configure 2265 dh_testdir 2266 2267 # Configure the package. 2268 CFLAGS="$(CFLAGS)" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr 2269 --mandir=\$${prefix}/share/man 2270 2271 # Build both architecture dependent and independent 2272 build: build-arch build-indep 2273 2274 # Build architecture dependent 2275 build-arch: build-arch-stamp 2276 2277 build-arch-stamp: config.status 2278 dh_testdir 2279 2280 # Compile the package. 2281 $(MAKE) 2282 2283 touch build-stamp 2284 2285 # Build architecture independent 2286 build-indep: build-indep-stamp 2287 2288 build-indep-stamp: config.status 2289 # Nothing to do, the only indep item is the manual which is available as html in original source 2290 touch build-indep-stamp 2291 2292 # Clean up 2293 clean: 2294 dh_testdir 2295 dh_testroot 2296 rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP# 2297 # Clean temporary document directory 2298 rm -rf debian/doc-temp 2299 # Clean up. 2300 -$(MAKE) distclean 2301 rm -f config.log 2302 ifneq "$(wildcard /usr/share/misc/config.sub)" "" 2303 cp -f /usr/share/misc/config.sub config.sub 2304 endif 2305 ifneq "$(wildcard /usr/share/misc/config.guess)" "" 2306 cp -f /usr/share/misc/config.guess config.guess 2307 endif 2308 2309 dh_clean 2310 2311 # Install architecture dependent and independent 2312 install: install-arch install-indep 2313 2314 # Install architecture dependent 2315 install-arch: build-arch 2316 dh_testdir 2317 dh_testroot 2318 dh_clean -k -s 2319 dh_installdirs -s 2320 2321 # Install the package files into build directory: 2322 # - start with upstream make install 2323 $(MAKE) install prefix=$(CURDIR)/debian/$(PACKAGE_NAME)/usr mandir=$(CURDIR)/debian/$(PACKAGE_NAME)/us 2324 r/share/man 2325 # - copy html manual to temporary location for renaming 2326 mkdir -p debian/doc-temp 2327 dh_install -s 2328 2329 # Install architecture independent 2330 install-indep: build-indep 2331 dh_testdir 2332 dh_testroot 2333 dh_clean -k -i 2334 dh_installdirs -i 2335 dh_install -i 2336 2337 # Must not depend on anything. This is to be called by 2338 # binary-arch/binary-indep 2339 # in another 'make' thread. 2340 binary-common: 2341 dh_testdir 2342 dh_testroot 2343 dh_installchangelogs ChangeLog 2344 dh_installdocs 2345 dh_installman 2346 dh_link 2347 dh_strip 2348 dh_compress 2349 dh_fixperms 2350 dh_installdeb 2351 dh_shlibdeps 2352 dh_gencontrol 2353 dh_md5sums 2354 dh_builddeb 2355 2356 # Build architecture independant packages using the common target. 2357 binary-indep: build-indep install-indep 2358 $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common 2359 2360 # Build architecture dependant packages using the common target. 2361 binary-arch: build-arch install-arch 2362 $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common 2363 2364 # Build architecture depdendent and independent packages 2365 binary: binary-arch binary-indep 2366 .PHONY: clean binary 2367 2368 EOF 2369 close(CONF); 2370 pb_mkdir_p("$ENV{'PBROOTDIR'}/$pp/rpm") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/rpm"; 2371 open(CONF,"> $ENV{'PBROOTDIR'}/$pp/rpm/$pp.spec") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/rpm/$pp.spec"; 2372 print CONF << 'EOF'; 2373 # 2374 # $Id$ 2375 # 2376 2377 Summary: bla-bla 2378 Summary(fr): french bla-bla 2379 2380 Name: PBPKG 2381 Version: PBVER 2382 Release: PBTAGPBSUF 2383 License: PBLIC 2384 Group: PBGRP 2385 Url: PBURL 2386 Source: PBSRC 2387 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(id -u -n) 2388 #Requires: PBDEP 2389 2390 %description 2391 PBDESC 2392 2393 %description -l fr 2394 french desc 2395 2396 %prep 2397 %setup -q 2398 2399 %build 2400 %configure 2401 make %{?_smp_mflags} 2402 2403 %install 2404 %{__rm} -rf $RPM_BUILD_ROOT 2405 make DESTDIR=$RPM_BUILD_ROOT install 2406 2407 %clean 2408 %{__rm} -rf $RPM_BUILD_ROOT 2409 2410 %files 2411 %defattr(-,root,root) 2412 %doc ChangeLog 2413 %doc INSTALL COPYING README AUTHORS NEWS 2414 2415 %changelog 2416 PBLOG 2417 2418 EOF 2419 close(CONF); 2420 pb_mkdir_p("$ENV{'PBROOTDIR'}/$pp/pbfilter") || die "Unable to create $ENV{'PBROOTDIR'}/$pp/pbfilter"; 2421 2422 pb_log(0,"\nDo not to forget to commit the pbconf directory in your CMS if needed\n"); 2423 } 2424 } else { 2425 die "Unable to open $ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb"; 2426 } 2427 } 2428 umask 0022; 2429 return(\%filteredfiles, \%supfiles, \%defpkgdir, \%extpkgdir); 2430 } else { 2431 # Setup the variables from what has been stored at the end of cms2build 2432 my ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","pbroot"); 2433 $ENV{'PBROOTDIR'} = $var->{$ENV{'PBPROJ'}}; 2434 2435 ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","projver"); 2436 $ENV{'PBPROJVER'} = $var->{$ENV{'PBPROJ'}}; 2437 2438 ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","projtag"); 2439 $ENV{'PBPROJTAG'} = $var->{$ENV{'PBPROJ'}}; 2440 2441 ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/pbrc","pbpackager"); 2442 $ENV{'PBPACKAGER'} = $var->{$ENV{'PBPROJ'}}; 2443 2444 return; 2445 } 2446 } 2447 2448 # Function which returns a pointer on a table 2449 # corresponding to a set of values queried in the conf file 2450 # and test the returned vaue as they need to exist in that case 2451 sub pb_conf_get { 2452 2453 my @param = @_; 2454 my @return = pb_conf_get_if(@param); 2455 2456 die "No params found for $ENV{'PBPROJ'}" if (not @return); 2457 2458 foreach my $i (0..$#param) { 2459 die "No $param[$i] defined for $ENV{'PBPROJ'}" if (not defined $return[$i]); 2460 } 2461 return(@return); 2462 } 2463 2464 # Function which returns a pointer on a table 2465 # corresponding to a set of values queried in the conf file 2466 # Those value may be undef if they do not exist 2467 sub pb_conf_get_if { 2468 2469 my @param = @_; 2470 2471 # Everything is returned via ptr1 2472 my @ptr1 = (); 2473 my @ptr2 = (); 2474 @ptr1 = pb_conf_read_if("$ENV{'PBETC'}", @param) if (defined $ENV{'PBETC'}); 2475 @ptr2 = pb_conf_read_if("$ENV{'PBROOTDIR'}/$ENV{'PBPROJ'}.pb", @param) if ((defined $ENV{'PBROOTDIR'}) and (defined $ENV{'PBPROJ'})); 2476 2477 my $p1; 2478 my $p2; 2479 2480 pb_log(2,"DEBUG: pb_conf_get param1: ".Dumper(@ptr1)."\n"); 2481 pb_log(2,"DEBUG: pb_conf_get param2: ".Dumper(@ptr2)."\n"); 2482 2483 foreach my $i (0..$#param) { 2484 $p1 = $ptr1[$i]; 2485 $p2 = $ptr2[$i]; 2486 # Always try to take the param from the home dir conf file in priority 2487 # in order to mask what could be defined under the CMS to allow for overloading 2488 if (not defined $p2) { 2489 # No ref in CMS project conf file so use the home dir one. 2490 $p1->{$ENV{'PBPROJ'}} = $p1->{'default'} if ((not defined $p1->{$ENV{'PBPROJ'}}) && (defined $p1->{'default'})); 2491 } else { 2492 # Ref found in CMS project conf file 2493 if (not defined $p1) { 2494 # No ref in home dir project conf file so use the CMS one. 2495 $p2->{$ENV{'PBPROJ'}} = $p2->{'default'} if ((not defined $p2->{$ENV{'PBPROJ'}}) && (defined $p2->{'default'})); 2496 $p1 = $p2; 2497 } else { 2498 # Both are defined - handling the overloading 2499 if (not defined $p1->{'default'}) { 2500 if (defined $p2->{'default'}) { 2501 $p1->{'default'} = $p2->{'default'}; 2502 } 2503 } 2504 2505 if (not defined $p1->{$ENV{'PBPROJ'}}) { 2506 if (defined $p2->{$ENV{'PBPROJ'}}) { 2507 $p1->{$ENV{'PBPROJ'}} = $p2->{$ENV{'PBPROJ'}} if (defined $p2->{$ENV{'PBPROJ'}}); 2508 } else { 2509 $p1->{$ENV{'PBPROJ'}} = $p1->{'default'} if (defined $p1->{'default'}); 2510 } 2511 } 2512 # Now copy back into p1 all p2 content which doesn't exist in p1 2513 # p1 content (local) always has priority over p2 (project) 2514 foreach my $k (keys %$p2) { 2515 $p1->{$k} = $p2->{$k} if (not defined $p1->{$k}); 2516 } 2517 } 2518 } 2519 $ptr1[$i] = $p1; 2520 } 2521 pb_log(2,"DEBUG: pb_conf_get param ptr1: ".Dumper(@ptr1)."\n"); 2522 return(@ptr1); 2523 } 2524 2525 # Setup environment for CMS system for URL passed 2526 sub pb_cms_init { 2527 2528 my $pbinit = shift || undef; 2529 2530 my ($pburl) = pb_conf_get("pburl"); 2531 pb_log(2,"DEBUG: Project URL of $ENV{'PBPROJ'}: $pburl->{$ENV{'PBPROJ'}}\n"); 2532 my ($scheme, $account, $host, $port, $path) = pb_get_uri($pburl->{$ENV{'PBPROJ'}}); 2533 2534 my ($pbprojdir) = pb_conf_get_if("pbprojdir"); 2535 2536 if ((defined $pbprojdir) && (defined $pbprojdir->{$ENV{'PBPROJ'}})) { 2537 $ENV{'PBPROJDIR'} = $pbprojdir->{$ENV{'PBPROJ'}}; 2538 } else { 2539 $ENV{'PBPROJDIR'} = "$ENV{'PBDEFDIR'}/$ENV{'PBPROJ'}"; 2540 } 2541 2542 # Computing the default dir for PBDIR. 2543 # what we have is PBPROJDIR so work from that. 2544 # Tree identical between PBCONFDIR and PBROOTDIR on one side and 2545 # PBPROJDIR and PBDIR on the other side. 2546 2547 my $tmp = $ENV{'PBROOTDIR'}; 2548 $tmp =~ s|^$ENV{'PBCONFDIR'}||; 2549 2550 # 2551 # Check project cms compliance 2552 # 2553 pb_cms_compliant(undef,'PBDIR',"$ENV{'PBPROJDIR'}/$tmp",$pburl->{$ENV{'PBPROJ'}},$pbinit); 2554 2555 if ($scheme =~ /^svn/) { 2556 # svnversion more precise than svn info 2557 $tmp = `(cd "$ENV{'PBDIR'}" ; svnversion .)`; 2558 chomp($tmp); 2559 $ENV{'PBREVISION'}=$tmp; 2560 $ENV{'PBCMSLOGFILE'}="svn.log"; 2561 } elsif (($scheme eq "file") || ($scheme eq "ftp") || ($scheme eq "http")) { 2562 $ENV{'PBREVISION'}="flat"; 2563 $ENV{'PBCMSLOGFILE'}="flat.log"; 2564 } elsif ($scheme =~ /^cvs/) { 2565 # Way too slow 2566 #$ENV{'PBREVISION'}=`(cd "$ENV{'PBROOTDIR'}" ; cvs rannotate -f . 2>&1 | awk '{print \$1}' | grep -E '^[0-9]' | cut -d. -f2 |sort -nu | tail -1)`; 2567 #chomp($ENV{'PBREVISION'}); 2568 $ENV{'PBREVISION'}="cvs"; 2569 $ENV{'PBCMSLOGFILE'}="cvs.log"; 2570 $ENV{'CVS_RSH'} = "ssh" if ($scheme =~ /ssh/); 2571 } else { 2572 die "cms $scheme unknown"; 2573 } 2574 2575 return($scheme,$pburl->{$ENV{'PBPROJ'}}); 2576 } 2577 2578 sub pb_cms_export { 2579 2580 my $uri = shift; 2581 my $source = shift; 2582 my $destdir = shift; 2583 my $tmp; 2584 my $tmp1; 2585 2586 my @date = pb_get_date(); 2587 # If it's not flat, then we have a real uri as source 2588 my ($scheme, $account, $host, $port, $path) = pb_get_uri($uri); 2589 2590 if ($scheme =~ /^svn/) { 2591 if (-d $source) { 2592 $tmp = $destdir; 2593 } else { 2594 $tmp = "$destdir/".basename($source); 2595 } 2596 pb_system("svn export $source $tmp","Exporting $source from SVN to $tmp"); 2597 } elsif ($scheme eq "dir") { 2598 pb_system("cp -a $path $destdir","Copying $uri from DIR to $destdir"); 2599 } elsif (($scheme eq "http") || ($scheme eq "ftp")) { 2600 my $f = basename($path); 2601 unlink "$ENV{'PBTMP'}/$f"; 2602 if (-x "/usr/bin/wget") { 2603 pb_system("/usr/bin/wget -nv -O $ENV{'PBTMP'}/$f $uri"," "); 2604 } elsif (-x "/usr/bin/curl") { 2605 pb_system("/usr/bin/curl $uri -o $ENV{'PBTMP'}/$f","Downloading $uri with curl to $ENV{'PBTMP'}/$f\n"); 2606 } else { 2607 die "Unable to download $uri.\nNo wget/curl available, please install one of those"; 2608 } 2609 pb_cms_export("file://$ENV{'PBTMP'}/$f",$source,$destdir); 2610 } elsif ($scheme eq "file") { 2611 use File::MimeInfo; 2612 my $mm = mimetype($path); 2613 pb_log(2,"mimetype: $mm\n"); 2614 pb_mkdir_p($destdir); 2615 2616 # Check whether the file is well formed 2617 # (containing already a directory with the project-version name) 2618 my ($pbwf) = pb_conf_get_if("pbwf"); 2619 if ((defined $pbwf) && (defined $pbwf->{$ENV{'PBPROJ'}})) { 2620 $destdir = dirname($destdir); 2621 } 2622 2623 if ($mm =~ /\/x-bzip-compressed-tar$/) { 2624 # tar+bzip2 2625 pb_system("cd $destdir ; tar xfj $path","Extracting $path in $destdir"); 2626 } elsif ($mm =~ /\/x-lzma-compressed-tar$/) { 2627 # tar+lzma 2628 pb_system("cd $destdir ; tar xfY $path","Extracting $path in $destdir"); 2629 } elsif ($mm =~ /\/x-compressed-tar$/) { 2630 # tar+gzip 2631 pb_system("cd $destdir ; tar xfz $path","Extracting $path in $destdir"); 2632 } elsif ($mm =~ /\/x-tar$/) { 2633 # tar 2634 pb_system("cd $destdir ; tar xf $path","Extracting $path in $destdir"); 2635 } elsif ($mm =~ /\/zip$/) { 2636 # zip 2637 pb_system("cd $destdir ; unzip $path","Extracting $path in $destdir"); 2638 } 2639 } elsif ($scheme =~ /^cvs/) { 2640 # CVS needs a relative path ! 2641 my $dir=dirname($destdir); 2642 my $base=basename($destdir); 2643 # CVS also needs a modules name not a dir 2644 #if (-d $source) { 2645 $tmp1 = basename($source); 2646 #} else { 2647 #$tmp1 = dirname($source); 2648 #$tmp1 = basename($tmp1); 2649 #} 2650 my $optcvs = ""; 2651 2652 # If we're working on the CVS itself 2653 my $cvstag = basename($ENV{'PBROOTDIR'}); 2654 my $cvsopt = ""; 2655 if ($cvstag eq "cvs") { 2656 my $pbdate = strftime("%Y-%m-%d %H:%M:%S", @date); 2657 $cvsopt = "-D \"$pbdate\""; 2658 } else { 2659 # we're working on a tag which should be the last part of PBROOTDIR 2660 $cvsopt = "-r $cvstag"; 2661 } 2662 pb_system("cd $dir ; cvs -d $account\@$host:$path export $cvsopt -d $base $tmp1","Exporting $tmp1 from $source under CVS to $destdir"); 2663 } else { 2664 die "cms $scheme unknown"; 2665 } 2666 } 2667 2668 2669 sub pb_create_authors { 2670 2671 my $authors=shift; 2672 my $dest=shift; 2673 my $scheme=shift; 2674 2675 return if ($authors eq "/dev/null"); 2676 open(SAUTH,$authors) || die "Unable to open $authors"; 2677 # Save a potentially existing AUTHORS file and write instead toi AUTHORS.pb 2678 my $ext = ""; 2679 if (-f "$dest/AUTHORS") { 2680 $ext = ".pb"; 2681 } 2682 open(DAUTH,"> $dest/AUTHORS$ext") || die "Unable to create $dest/AUTHORS$ext"; 2683 print DAUTH "Authors of the project are:\n"; 2684 print DAUTH "===========================\n"; 2685 while (<SAUTH>) { 2686 my ($nick,$gcos) = split(/:/); 2687 chomp($gcos); 2688 print DAUTH "$gcos"; 2689 if (defined $scheme) { 2690 # Do not give a scheme for flat types 2691 my $endstr=""; 2692 if ("$ENV{'PBREVISION'}" ne "flat") { 2693 $endstr = " under $scheme"; 2694 } 2695 print DAUTH " ($nick$endstr)\n"; 2696 } else { 2697 print DAUTH "\n"; 2698 } 2699 } 2700 close(DAUTH); 2701 close(SAUTH); 2702 } 2703 2704 sub pb_cms_log { 2705 2706 my $scheme = shift; 2707 my $pkgdir = shift; 2708 my $dest = shift; 2709 my $chglog = shift; 2710 my $authors = shift; 2711 2712 pb_create_authors($authors,$dest,$scheme); 2713 2714 if ($scheme =~ /^svn/) { 2715 if (! -f "$dest/ChangeLog") { 2716 if (-x "/usr/bin/svn2cl") { 2717 # In case we have no network, just create an empty one before to allow correct build 2718 open(CL,"> $dest/ChangeLog") || die "Unable to create $dest/ChangeLog"; 2719 close(CL); 2720 pb_system("/usr/bin/svn2cl --group-by-day --authors=$authors -i -o $dest/ChangeLog $pkgdir","Generating ChangeLog from SVN with svn2cl"); 2721 } else { 2722 # To be written from pbcl 2723 pb_system("svn log -v $pkgdir > $dest/$ENV{'PBCMSLOGFILE'}","Extracting log info from SVN"); 2724 } 2725 } 2726 } elsif (($scheme eq "file") || ($scheme eq "dir") || ($scheme eq "http") || ($scheme eq "ftp")) { 2727 if (! -f "$dest/ChangeLog") { 2728 pb_system("echo ChangeLog for $pkgdir > $dest/ChangeLog","Empty ChangeLog file created"); 2729 } 2730 } elsif ($scheme =~ /^cvs/) { 2731 my $tmp=basename($pkgdir); 2732 # CVS needs a relative path ! 2733 if (! -f "$dest/ChangeLog") { 2734 if (-x "/usr/bin/cvs2cl") { 2735 # In case we have no network, just create an empty one before to allow correct build 2736 open(CL,"> $dest/ChangeLog") || die "Unable to create $dest/ChangeLog"; 2737 close(CL); 2738 pb_system("/usr/bin/cvs2cl --group-by-day -U $authors -f $dest/ChangeLog $pkgdir","Generating ChangeLog from CVS with cvs2cl"); 2739 } else { 2740 # To be written from pbcl 2741 pb_system("cvs log $tmp > $dest/$ENV{'PBCMSLOGFILE'}","Extracting log info from CVS"); 2742 } 2743 } 2744 } else { 2745 die "cms $scheme unknown"; 2746 } 2747 } 2748 2749 # This function is only called with a real CMS system 2750 sub pb_cms_get_uri { 2751 2752 my $scheme = shift; 2753 my $dir = shift; 2754 2755 my $res = ""; 2756 my $void = ""; 2757 2758 if ($scheme =~ /^svn/) { 2759 open(PIPE,"LANGUAGE=C svn info $dir |") || return(""); 2760 while (<PIPE>) { 2761 ($void,$res) = split(/^URL:/) if (/^URL:/); 2762 } 2763 $res =~ s/^\s*//; 2764 close(PIPE); 2765 chomp($res); 2766 } elsif ($scheme =~ /^cvs/) { 2767 # This path is always the root path of CVS, but we may be below 2768 open(FILE,"$dir/CVS/Root") || die "$dir isn't CVS controlled"; 2769 $res = <FILE>; 2770 chomp($res); 2771 close(FILE); 2772 # Find where we are in the tree 2773 my $rdir = $dir; 2774 while ((! -d "$rdir/CVSROOT") && ($rdir ne "/")) { 2775 $rdir = dirname($rdir); 2776 } 2777 die "Unable to find a CVSROOT dir in the parents of $dir" if (! -d "$rdir/CVSROOT"); 2778 #compute our place under that root dir - should be a relative path 2779 $dir =~ s|^$rdir||; 2780 my $suffix = ""; 2781 $suffix = "$dir" if ($dir ne ""); 2782 2783 my $prefix = ""; 2784 if ($scheme =~ /ssh/) { 2785 $prefix = "cvs+ssh://"; 2786 } else { 2787 $prefix = "cvs://"; 2788 } 2789 $res = $prefix.$res.$suffix; 2790 } else { 2791 die "cms $scheme unknown"; 2792 } 2793 pb_log(2,"Found CMS info: $res\n"); 2794 return($res); 2795 } 2796 2797 sub pb_cms_copy { 2798 my $scheme = shift; 2799 my $oldurl = shift; 2800 my $newurl = shift; 2801 2802 if ($scheme =~ /^svn/) { 2803 pb_system("svn copy -m \"Creation of $newurl from $oldurl\" $oldurl $newurl","Copying $oldurl to $newurl "); 2804 } elsif ($scheme eq "flat") { 2805 } elsif ($scheme =~ /^cvs/) { 2806 } else { 2807 die "cms $scheme unknown"; 2808 } 2809 } 2810 2811 sub pb_cms_checkout { 2812 my $scheme = shift; 2813 my $url = shift; 2814 my $destination = shift; 2815 2816 if ($scheme =~ /^svn/) { 2817 pb_system("svn co $url $destination","Checking out $url to $destination "); 2818 } elsif (($scheme eq "ftp") || ($scheme eq "http")) { 2819 return; 2820 } elsif ($scheme =~ /^cvs/) { 2821 pb_system("cvs co $url $destination","Checking out $url to $destination "); 2822 } else { 2823 die "cms $scheme unknown"; 2824 } 2825 } 2826 2827 sub pb_cms_up { 2828 my $scheme = shift; 2829 my $dir = shift; 2830 2831 if ($scheme =~ /^svn/) { 2832 pb_system("svn up $dir","Updating $dir"); 2833 } elsif ($scheme eq "flat") { 2834 } elsif ($scheme =~ /^cvs/) { 2835 } else { 2836 die "cms $scheme unknown"; 2837 } 2838 } 2839 2840 sub pb_cms_checkin { 2841 my $scheme = shift; 2842 my $dir = shift; 2843 2844 my $ver = basename($dir); 2845 if ($scheme =~ /^svn/) { 2846 pb_system("svn ci -m \"updated to $ver\" $dir","Checking in $dir"); 2847 } elsif ($scheme eq "flat") { 2848 } elsif ($scheme =~ /^cvs/) { 2849 } else { 2850 die "cms $scheme unknown"; 2851 } 2852 pb_cms_up($scheme,$dir); 2853 } 2854 2855 sub pb_cms_isdiff { 2856 my $scheme = shift; 2857 my $dir =shift; 2858 2859 if ($scheme =~ /^svn/) { 2860 open(PIPE,"svn diff $dir |") || die "Unable to get svn diff from $dir"; 2861 my $l = 0; 2862 while (<PIPE>) { 2863 $l++; 2864 } 2865 return($l); 2866 } elsif ($scheme eq "flat") { 2867 } elsif ($scheme =~ /^cvs/) { 2868 open(PIPE,"cvs diff $dir |") || die "Unable to get svn diff from $dir"; 2869 my $l = 0; 2870 while (<PIPE>) { 2871 # Skipping normal messages 2872 next if (/^cvs diff:/); 2873 $l++; 2874 } 2875 return($l); 2876 } else { 2877 die "cms $scheme unknown"; 2878 } 2879 } 2880 2881 # Get all filters to apply 2882 # They're cumulative from less specific to most specific 2883 # suffix is .pbf 2884 2885 sub pb_get_filters { 2886 2887 my @ffiles; 2888 my ($ffile00, $ffile0, $ffile1, $ffile2, $ffile3); 2889 my ($mfile00, $mfile0, $mfile1, $mfile2, $mfile3); 2890 my $pbpkg = shift || die "No package specified"; 2891 my $dtype = shift || ""; 2892 my $dfam = shift || ""; 2893 my $ddir = shift || ""; 2894 my $dver = shift || ""; 2895 my $ptr = undef; # returned value pointer on the hash of filters 2896 my %h; 2897 2898 # Global filter files first, then package specificities 2899 if (-d "$ENV{'PBROOTDIR'}/pbfilter") { 2900 $mfile00 = "$ENV{'PBROOTDIR'}/pbfilter/all.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/all.pbf"); 2901 $mfile0 = "$ENV{'PBROOTDIR'}/pbfilter/$dtype.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/$dtype.pbf"); 2902 $mfile1 = "$ENV{'PBROOTDIR'}/pbfilter/$dfam.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/$dfam.pbf"); 2903 $mfile2 = "$ENV{'PBROOTDIR'}/pbfilter/$ddir.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/$ddir.pbf"); 2904 $mfile3 = "$ENV{'PBROOTDIR'}/pbfilter/$ddir-$dver.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/$ddir-$dver.pbf"); 2905 2906 push @ffiles,$mfile00 if (defined $mfile00); 2907 push @ffiles,$mfile0 if (defined $mfile0); 2908 push @ffiles,$mfile1 if (defined $mfile1); 2909 push @ffiles,$mfile2 if (defined $mfile2); 2910 push @ffiles,$mfile3 if (defined $mfile3); 2911 } 2912 2913 if (-d "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter") { 2914 $ffile00 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/all.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/all.pbf"); 2915 $ffile0 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$dtype.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$dtype.pbf"); 2916 $ffile1 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$dfam.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$dfam.pbf"); 2917 $ffile2 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$ddir.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$ddir.pbf"); 2918 $ffile3 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$ddir-$dver.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$ddir-$dver.pbf"); 2919 2920 push @ffiles,$ffile00 if (defined $ffile00); 2921 push @ffiles,$ffile0 if (defined $ffile0); 2922 push @ffiles,$ffile1 if (defined $ffile1); 2923 push @ffiles,$ffile2 if (defined $ffile2); 2924 push @ffiles,$ffile3 if (defined $ffile3); 2925 } 2926 if (@ffiles) { 2927 pb_log(2,"DEBUG ffiles: ".Dumper(\@ffiles)."\n"); 2928 2929 foreach my $f (@ffiles) { 2930 open(CONF,$f) || next; 2931 while(<CONF>) { 2932 if (/^\s*([A-z0-9-_]+)\s+([[A-z0-9-_]+)\s*=\s*(.+)$/) { 2933 $h{$1}{$2}=$3; 2934 } 2935 } 2936 close(CONF); 2937 2938 $ptr = $h{"filter"}; 2939 pb_log(2,"DEBUG f:".Dumper($ptr)."\n"); 2940 } 2941 } 2942 return($ptr); 2943 } 2944 2945 # Function which applies filter on pb build files 2946 sub pb_filter_file_pb { 2947 2948 my $f=shift; 2949 my $ptr=shift; 2950 my %filter=%$ptr; 2951 my $destfile=shift; 2952 my $dtype=shift; 2953 my $pbsuf=shift; 2954 my $pbproj=shift; 2955 my $pbpkg=shift; 2956 my $pbver=shift; 2957 my $pbtag=shift; 2958 my $pbrev=shift; 2959 my $pbdate=shift; 2960 my $defpkgdir = shift; 2961 my $extpkgdir = shift; 2962 my $pbpackager = shift; 2963 my $chglog = shift || undef; 2964 2965 pb_log(2,"DEBUG: From $f to $destfile\n"); 2966 pb_mkdir_p(dirname($destfile)) if (! -d dirname($destfile)); 2967 open(DEST,"> $destfile") || die "Unable to create $destfile"; 2968 open(FILE,"$f") || die "Unable to open $f: $!"; 2969 while (<FILE>) { 2970 my $line = $_; 2971 foreach my $s (keys %filter) { 2972 # Process single variables 2973 pb_log(2,"DEBUG filter{$s}: $filter{$s}\n"); 2974 my $tmp = $filter{$s}; 2975 next if (not defined $tmp); 2976 # Expand variables if any single one found 2977 pb_log(2,"DEBUG tmp: $tmp\n"); 2978 if ($tmp =~ /\$/) { 2979 eval { $tmp =~ s/(\$\w+)/$1/eeg }; 2980 # special case for ChangeLog only for pb 2981 } elsif (($s =~ /^PBLOG$/) && ($line =~ /^PBLOG$/)) { 2982 my $p = $defpkgdir->{$pbpkg}; 2983 $p = $extpkgdir->{$pbpkg} if (not defined $p); 2984 pb_changelog($dtype, $pbpkg, $pbver, $pbtag, $pbsuf, $p, \*DEST, $tmp, $chglog); 2985 $tmp = ""; 2986 } 2987 $line =~ s|$s|$tmp|; 2988 } 2989 print DEST $line; 2990 } 2991 close(FILE); 2992 close(DEST); 2993 } 2994 2995 # Function which applies filter on files (external call) 2996 sub pb_filter_file_inplace { 2997 2998 my $ptr=shift; 2999 my %filter=%$ptr; 3000 my $destfile=shift; 3001 my $pbproj=shift; 3002 my $pbpkg=shift; 3003 my $pbver=shift; 3004 my $pbtag=shift; 3005 my $pbrev=shift; 3006 my $pbdate=shift; 3007 my $pbpackager=shift; 3008 3009 my $cp = "$ENV{'PBTMP'}/".basename($destfile); 3010 copy($destfile,$cp) || die "Unable to create $cp"; 3011 3012 pb_filter_file($cp,$ptr,$destfile,$pbproj,$pbpkg,$pbver,$pbtag,$pbrev,$pbdate,$pbpackager); 3013 unlink $cp; 3014 } 3015 3016 # Function which applies filter on files (external call) 3017 sub pb_filter_file { 3018 3019 my $f=shift; 3020 my $ptr=shift; 3021 my %filter=%$ptr; 3022 my $destfile=shift; 3023 my $pbproj=shift; 3024 my $pbpkg=shift; 3025 my $pbver=shift; 3026 my $pbtag=shift; 3027 my $pbrev=shift; 3028 my $pbdate=shift; 3029 my $pbpackager=shift; 3030 3031 pb_log(2,"DEBUG: From $f to $destfile\n"); 3032 pb_mkdir_p(dirname($destfile)) if (! -d dirname($destfile)); 3033 open(DEST,"> $destfile") || die "Unable to create $destfile"; 3034 open(FILE,"$f") || die "Unable to open $f: $!"; 3035 while (<FILE>) { 3036 my $line = $_; 3037 foreach my $s (keys %filter) { 3038 # Process single variables 3039 pb_log(2,"DEBUG filter{$s}: $filter{$s}\n"); 3040 my $tmp = $filter{$s}; 3041 next if (not defined $tmp); 3042 # Expand variables if any single one found 3043 if ($tmp =~ /\$/) { 3044 eval { $tmp =~ s/(\$\w+)/$1/eeg }; 3045 } 3046 $line =~ s|$s|$tmp|; 3047 } 3048 print DEST $line; 3049 } 3050 close(FILE); 3051 close(DEST); 3052 } 3053 3054 # 3055 # Return the list of packages we are working on in a CMS action 3056 # 3057 sub pb_cms_get_pkg { 3058 3059 my @pkgs = (); 3060 my $defpkgdir = shift || undef; 3061 my $extpkgdir = shift || undef; 3062 3063 # Get packages list 3064 if (not defined $ARGV[0]) { 3065 @pkgs = keys %$defpkgdir if (defined $defpkgdir); 3066 } elsif ($ARGV[0] =~ /^all$/) { 3067 @pkgs = keys %$defpkgdir if (defined $defpkgdir); 3068 push(@pkgs, keys %$extpkgdir) if (defined $extpkgdir); 3069 } else { 3070 @pkgs = @ARGV; 3071 } 3072 pb_log(0,"Packages: ".join(',',@pkgs)."\n"); 3073 return(\@pkgs); 3074 } 3075 3076 # 3077 # Return the list of packages we are working on in a non CMS action 3078 # 3079 sub pb_get_pkg { 3080 3081 my @pkgs = (); 3082 3083 my ($var) = pb_conf_read("$ENV{'PBDESTDIR'}/$ENV{'PBPROJVER'}-$ENV{'PBPROJTAG'}.pb","pbpkg"); 3084 @pkgs = keys %$var; 3085 3086 pb_log(0,"Packages: ".join(',',@pkgs)."\n"); 3087 return(\@pkgs); 3088 } 3089 3090 # 3091 # Check pbconf/project cms compliance 3092 # 3093 sub pb_cms_compliant { 3094 3095 my $param = shift; 3096 my $envar = shift; 3097 my $defdir = shift; 3098 my $uri = shift; 3099 my $pbinit = shift; 3100 my %pdir; 3101 3102 my ($pdir) = pb_conf_get_if($param) if (defined $param); 3103 if (defined $pdir) { 3104 %pdir = %$pdir; 3105 } 3106 3107 3108 if ((defined $pdir) && (%pdir) && (defined $pdir{$ENV{'PBPROJ'}})) { 3109 # That's always the environment variable that will be used 3110 $ENV{$envar} = $pdir{$ENV{'PBPROJ'}}; 3111 } else { 3112 if (defined $param) { 3113 pb_log(1,"WARNING: no $param defined, using $defdir\n"); 3114 pb_log(1," Please create a $param reference for project $ENV{'PBPROJ'} in $ENV{'PBETC'}\n"); 3115 pb_log(1," if you want to use another directory\n"); 3116 } 3117 $ENV{$envar} = "$defdir"; 3118 } 3119 3120 # Expand potential env variable in it 3121 eval { $ENV{$envar} =~ s/(\$ENV.+\})/$1/eeg }; 3122 pb_log(2,"$envar: $ENV{$envar}\n"); 3123 3124 my ($scheme, $account, $host, $port, $path) = pb_get_uri($uri); 3125 3126 if ((! -d "$ENV{$envar}") || (defined $pbinit)) { 3127 if (defined $pbinit) { 3128 pb_mkdir_p("$ENV{$envar}"); 3129 } else { 3130 pb_log(1,"Checking out $uri\n"); 3131 pb_cms_checkout($scheme,$uri,$ENV{$envar}); 3132 } 3133 } elsif (($scheme !~ /^cvs/) || ($scheme !~ /^svn/)) { 3134 # Do not compare if it's not a real cms 3135 return; 3136 } else { 3137 pb_log(1,"$uri found locally, checking content\n"); 3138 my $cmsurl = pb_cms_get_uri($scheme,$ENV{$envar}); 3139 my ($scheme2, $account2, $host2, $port2, $path2) = pb_get_uri($cmsurl); 3140 if ($cmsurl ne $uri) { 3141 # The local content doesn't correpond to the repository 3142 pb_log(0,"ERROR: Inconsistency detected:\n"); 3143 pb_log(0," * $ENV{$envar} refers to $cmsurl but\n"); 3144 pb_log(0," * $ENV{'PBETC'} refers to $uri\n"); 3145 die "Project $ENV{'PBPROJ'} is not Project-Builder compliant."; 3146 } else { 3147 pb_log(1,"Content correct - doing nothing - you may want to update your repository however\n"); 3148 # they match - do nothing - there may be local changes 3149 } 3150 } 3151 } 3152 3153 sub pb_changelog { 3154 3155 my $dtype = shift; 3156 my $pkg = shift; 3157 my $pbver = shift; 3158 my $pbtag = shift; 3159 my $dsuf = shift; 3160 my $path = shift; 3161 my $OUTPUT = shift; 3162 my $doit = shift; 3163 my $chglog = shift || undef; 3164 3165 my $log = ""; 3166 3167 # For date handling 3168 $ENV{LANG}="C"; 3169 3170 if ((not (defined $dtype)) || ($dtype eq "") || 3171 (not (defined $pkg)) || ($pkg eq "") || 3172 (not (defined $pbver)) || ($pbver eq "") || 3173 (not (defined $pbtag)) || ($pbtag eq "") || 3174 (not (defined $dsuf)) || ($dsuf eq "") || 3175 (not (defined $path)) || ($path eq "") || 3176 (not (defined $OUTPUT)) || ($OUTPUT eq "") || 3177 (not (defined $doit)) || ($doit eq "")) { 3178 print $OUTPUT "\n"; 3179 return; 3180 } 3181 3182 if (((not defined $chglog) || (! -f $chglog)) && ($doit eq "yes")) { 3183 #pb_log(2,"No ChangeLog file ($chglog) for $pkg\n"; 3184 print $OUTPUT "\n"; 3185 return; 3186 } 3187 3188 my $date; 3189 my $ndate; 3190 my $n2date; 3191 my $ver; 3192 my $ver2; 3193 my ($pbpackager) = pb_conf_get("pbpackager"); 3194 3195 if (not defined $pbpackager->{$ENV{'PBPROJ'}}) { 3196 $pbpackager->{$ENV{'PBPROJ'}} = "undefined\@noproject.noorg"; 3197 } 3198 3199 # If we don't need to do it, or don't have it fake something 3200 if (((not defined $chglog) || (! -f $chglog)) && ($doit ne "yes")) { 3201 my @date=(localtime->sec(), localtime->min(), localtime->hour(), localtime->mday(), localtime->mon(), localtime->year(), localtime->wday(), localtime->yday(), localtime->isdst()); 3202 $date = strftime("%Y-%m-%d", @date); 3203 $ndate = UnixDate($date,"%a", "%b", "%d", "%Y"); 3204 $n2date = &UnixDate($date,"%a, %d %b %Y %H:%M:%S %z"); 3205 if (($dtype eq "rpm") || ($dtype eq "fc")) { 3206 $ver2 = "$pbver-$pbtag$dsuf"; 3207 print $OUTPUT "* $ndate $pbpackager->{$ENV{'PBPROJ'}} $ver2\n"; 3208 print $OUTPUT "- Updated to $pbver\n"; 3209 } 3210 if ($dtype eq "deb") { 3211 print $OUTPUT "$pkg ($pbver) unstable; urgency=low\n"; 3212 print $OUTPUT "\n"; 3213 print $OUTPUT " -- $pbpackager->{$ENV{'PBPROJ'}} $n2date\n\n\n"; 3214 } 3215 return; 3216 } 3217 3218 open(INPUT,"$chglog") || die "Unable to open $chglog (read)"; 3219 3220 # Skip first 4 lines 3221 my $tmp = <INPUT>; 3222 $tmp = <INPUT>; 3223 $tmp = <INPUT>; 3224 if ($dtype eq "announce") { 3225 print $OUTPUT $tmp; 3226 } 3227 $tmp = <INPUT>; 3228 if ($dtype eq "announce") { 3229 print $OUTPUT $tmp; 3230 } 3231 3232 my $first=1; 3233 3234 # Handle each block separated by newline 3235 while (<INPUT>) { 3236 ($ver, $date) = split(/ /); 3237 $ver =~ s/^v//; 3238 chomp($date); 3239 $date =~ s/\(([0-9-]+)\)/$1/; 3240 #pb_log(2,"**$date**\n"; 3241 $ndate = UnixDate($date,"%a", "%b", "%d", "%Y"); 3242 $n2date = &UnixDate($date,"%a, %d %b %Y %H:%M:%S %z"); 3243 #pb_log(2,"**$ndate**\n"; 3244 3245 if (($dtype eq "rpm") || ($dtype eq "fc")) { 3246 if ($ver !~ /-/) { 3247 if ($first eq 1) { 3248 $ver2 = "$ver-$pbtag$dsuf"; 3249 $first=0; 3250 } else { 3251 $ver2 = "$ver-1$dsuf"; 3252 } 3253 } else { 3254 $ver2 = "$ver$dsuf"; 3255 } 3256 print $OUTPUT "* $ndate $pbpackager->{$ENV{'PBPROJ'}} $ver2\n"; 3257 print $OUTPUT "- Updated to $ver\n"; 3258 } 3259 if ($dtype eq "deb") { 3260 print $OUTPUT "$pkg ($ver) unstable; urgency=low\n"; 3261 print $OUTPUT "\n"; 3262 } 3263 3264 $tmp = <INPUT>; 3265 while ($tmp !~ /^$/) { 3266 if ($dtype eq "deb") { 3267 $tmp =~ s/^- //; 3268 print $OUTPUT " * $tmp"; 3269 } elsif ($dtype eq "rpm") { 3270 print $OUTPUT "$tmp"; 3271 } else { 3272 print $OUTPUT "$tmp"; 3273 } 3274 last if (eof(INPUT)); 3275 $tmp = <INPUT>; 3276 } 3277 print $OUTPUT "\n"; 3278 3279 if ($dtype eq "deb") { 3280 # Cf: http://www.debian.org/doc/debian-policy/ch-source.html#s-dpkgchangelog 3281 print $OUTPUT " -- $pbpackager->{$ENV{'PBPROJ'}} $n2date\n\n\n"; 3282 } 3283 3284 last if (eof(INPUT)); 3285 last if ($dtype eq "announce"); 3286 } 3287 close(INPUT); 3288 } 3289 1;
Note:
See TracChangeset
for help on using the changeset viewer.