PROBLEM: cvs i puchni

Michal Moskal malekith w pld-linux.org
Pon, 17 Mar 2003, 18:38:03 CET


On Mon, Mar 17, 2003 at 05:19:38PM +0100, Andrzej Krzysztofowicz wrote:
> > > 2. Jak sobie radzic przy problemach z fs-em ?
> > 
> > Nie rozumiem? Jakich problemach? Że za dużo plików w katalogu? Tak jak
> > napisałem jest ich około 256 razy mniej w katalogu.
> 
> Cos sie syplo, wcielo katalog. Zostaly pliki #nnnnnnnn w /lost+found ...
> Nie mow, ze z backupu ... ;)
> 
> > Właśnie piszę skrypt co to będzie dociągał (na distfiles) + support w
> > builderze i skrypcik do upgrejdu (żeby w specu md5 poprawiał) i powinno
> > być ok.
> 
> Co do samego pomyslu, to jestem za. Szczegoly mozna dopracowac.

Załączam co zrobiłem do tej pory, jutro to przetestuje i commitnę.

-- 
: Michal Moskal ::::: malekith/at/pld-linux.org :  GCS {C,UL}++++$ a? !tv
: PLD Linux ::::::: Wroclaw University, CS Dept :  {E-,w}-- {b++,e}>+++ h
-------------- następna część ---------
Index: builder
===================================================================
RCS file: /cvsroot/SPECS/builder,v
retrieving revision 1.135
diff -u -r1.135 builder
--- builder	16 Mar 2003 19:08:25 -0000	1.135
+++ builder	17 Mar 2003 17:36:21 -0000
@@ -302,6 +302,28 @@
     echo "$url"
 }
 
+src_no ()
+{
+    cd $SPECS_DIR
+    $RPMBUILD -bp  $BCOND --define 'prep %dump' $SPECFILE 2>&1 | \
+    	grep "SOURCEURL[0-9]*[ 	]*$1""[ 	]*$" | \
+	sed -e 's/.*SOURCEURL\([0-9][0-9]*\).*/\1/' | \
+	xargs
+}
+
+src_md5 ()
+{
+    no=$(src_no "$1")
+    [ -z "$no" ] && return
+    cd $SPECS_DIR
+    grep -i "#[ 	]*Source$no-md5[ 	]*:" $SPECFILE | sed -e 's/.*://' | xargs
+}
+
+distfiles_url ()
+{
+    echo "ftp://distfiles.pld.org.pl/src/$(src_md5 "$1" | sed -e 's|^\(.\)\(.\)|\1/\2/&|')"
+}
+
 get_files()
 {
     GET_FILES="$@"
@@ -334,7 +356,17 @@
 		    echo "Warning: no URL given for $i"
 		fi
 
-		if [ -z "$NOCVS" ]|| [ `echo $i | grep -vE '(ftp|http|https)://'` ]; then
+		if [ -n "$(src_md5 "$i")" ] ; then
+		    target=$(nourl "$i")
+		    url=$(distfiles_url "$i")
+		    if [ -z "$NOMIRRORS" ] ; then 
+			url="`find_mirror "$url"`"
+		    fi
+		    ${GETURI} -O "$target" "$url" || \
+			if [ `echo $url | grep -E 'ftp://'` ]; then 
+			  ${GETURI2} -O "$target" "$url"
+			fi
+		elif [ -z "$NOCVS" ]|| [ `echo $i | grep -vE '(ftp|http|https)://'` ]; then
 		    result=1
         	    retries_counter=0
 	            while [ "$result" != "0" -a "$retries_counter" -le "$CVS_RETRIES" ]; do
-------------- następna część ---------
#!/usr/bin/perl -w

$ftpdir = "/shm/ftp";

sub localfile ($)
{
  my $md5 = shift;
  $md5 =~ /^(.)(.)/ or die;
  return "$ftpdir/$1/$2/$md5";
}

SPEC: foreach (@ARGV) {
  $spec = $_;
  open(IN, "< $spec") or die "can't open $spec";
  $spec =~ m|([^/]+)\.spec$| or die;
  $spec_base = $1;

  # first extract src-number -> md5 mapping
  %src = ();
  $cnt = 0;
  $cvs_version = "";
  while (<IN>) {
    /\$Revision:\s*([\d\.]+)/ and $cvs_version = $1;
    /^\s*(#*)\s*source(\d+)-md5\s*:\s*([a-f0-9]{32})\s*$/i or next;
    $src{$2} = $3;
    $cnt++;
  }
  close(IN);

  $spec_id = "$spec_base-$cvs_version";

  # then remove files we already have from %src
  foreach $nr (keys %src) {
    $local = localfile($src{$nr}) . ".desc";
    if (-f $local) {
      open(DESC, "< $local") or die;
      $has = 0;
      while (<DESC>) {
        chomp;
        /^Used-by: $spec_id$/ and $has = 1;
      }
      close(DESC);
      if (!$has) {
        open(DESC, ">> $local") or die;
	print DESC "Used-by: $spec_id\n";
	close(DESC);
      }
      undef $src{$nr};
      $cnt--;
    }
  }

  # continue if we have no file in %src
  next SPEC if ($cnt == 0);

  %urls = ();
  
  open(RPM, "rpmbuild -bp --define 'prep \%dump' $spec 2>&1 |");
  $pkg_version = "";
  while (<RPM>) {
    /^[\s\d\-=:]+version\s+([^\s]*)\s*$/ and $pkg_version = $1;
    /^[\s\d\-=:]+SOURCEURL(\d+)\s+([^\s]*)\s*$/ or next;
    $urls{$1} = $2;
  }
  close(RPM);

  foreach $nr (keys %src) {
    defined $src{$nr} or next;
    $url = $urls{$nr};
    unless (defined $url) {
      print STDERR "$spec_id: no url for source #$nr\n";
      next;
    }
    $local = localfile($src{$nr});
    open(DESC, "> $local.desc") or die;
    print DESC "Fetched-for: $spec_base-$pkg_version\n";
    print DESC "Source-URL: $url\n";
    close(DESC);

    $err = system("wget -q -c -O $local.tmp $url");
    if ($err != 0) {
      print STDERR "$spec_id: failed to fetch $url\n";
      unlink("$local.desc");
      unlink("$local.tmp");
    } else {
      open(DESC, ">> $local.desc") or die;
      $md5 = `md5sum $local.tmp`;
      $md5 =~ /^([a-f0-9]{32})\s+/ or die;
      $md5 = $1;
      if ($md5 ne $src{$nr}) {
        print STDERR "$spec_id: md5 mismatch: $md5, while $src{$nr} expected for $url\n";
        unlink("$local.desc");
        unlink("$local.tmp");
      } else {
        print DESC "MD5: $md5\n";
	$size = -s "$local.tmp";
	$time = time;
	print DESC "Size: $size\nCurrent-time: $time\n";
        print DESC "Used-by: $spec_id\n";
	close(DESC);
        link("$local.tmp", "$local");
        unlink("$local.tmp");
      }
    }
  }
}


Więcej informacji o liście dyskusyjnej pld-devel-pl