febootstrap: Add --save-temps option to save temporary files on exit.
[febootstrap.git] / febootstrap_yum_rpm.ml
index 075e4e0..ca74f4a 100644 (file)
@@ -34,6 +34,7 @@ let yum_rpm_detect () =
 
 let yum_rpm_resolve_dependencies_and_download names =
   (* Liberate this data from python. *)
+  let tmpfile = tmpdir // "names.tmp" in
   let py = sprintf "
 import yum
 import yum.misc
@@ -42,10 +43,13 @@ import sys
 yb = yum.YumBase ()
 yb.preconf.debuglevel = %d
 yb.preconf.errorlevel = %d
+if %s:
+    yb.preconf.fn = %S
+yb.setCacheDir ()
 
 # Look up the base packages from the command line.
 deps = dict ()
-pkgs = yb.pkgSack.returnPackages (patterns=sys.argv[2:])
+pkgs = yb.pkgSack.returnPackages (patterns=sys.argv[1:])
 for pkg in pkgs:
     deps[pkg] = False
 
@@ -67,14 +71,18 @@ while not stable:
             deps[pkg] = yum.misc.unique (deps[pkg])
 
 # Write it to a file because yum spews garbage on stdout.
-f = open (sys.argv[1], \"w\")
+f = open (%S, \"w\")
 for pkg in deps.keys ():
     f.write (\"%%s %%s %%s %%s %%s\\n\" %%
              (pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch))
 f.close ()
-" (if verbose then 1 else 0) (if verbose then 1 else 0) in
-  let tmpfile = tmpdir // "names.tmp" in
-  run_python py (tmpfile :: names);
+"
+    (if verbose then 1 else 0)
+    (if verbose then 1 else 0)
+    (match yum_config with None -> "False" | Some _ -> "True")
+    (match yum_config with None -> "" | Some filename -> filename)
+    tmpfile in
+  run_python py names;
   let chan = open_in tmpfile in
   let lines = input_all_lines chan in
   close_in chan;
@@ -137,8 +145,10 @@ f.close ()
     exit 1
   );
 
-  let cmd = sprintf "yumdownloader%s --destdir %s %s"
+  let cmd = sprintf "yumdownloader%s%s --destdir %s %s"
     (if verbose then "" else " --quiet")
+    (match yum_config with None -> ""
+     | Some filename -> sprintf " -c %s" filename)
     (Filename.quote tmpdir)
     (String.concat " " (List.map Filename.quote pkgnames)) in
   run_command cmd;
@@ -153,7 +163,7 @@ f.close ()
 let rec yum_rpm_list_files pkg =
   (* Run rpm -qlp with some extra magic. *)
   let cmd =
-    sprintf "rpm -q --qf '[%%{FILENAMES} %%{FILEFLAGS:fflags} %%{FILEMODES}\\n]' -p %s"
+    sprintf "rpm -q --qf '[%%{FILENAMES} %%{FILEFLAGS:fflags} %%{FILEMODES} %%{FILESIZES}\\n]' -p %s"
       pkg in
   let lines = run_command_get_lines cmd in
 
@@ -161,15 +171,16 @@ let rec yum_rpm_list_files pkg =
     filter_map (
       fun line ->
         match string_split " " line with
-        | [filename; flags; mode] ->
+        | [filename; flags; mode; size] ->
             let test_flag = String.contains flags in
             let mode = int_of_string mode in
+           let size = int_of_string size in
             if test_flag 'd' then None  (* ignore documentation *)
             else
               Some (filename, {
                       ft_dir = mode land 0o40000 <> 0;
                       ft_ghost = test_flag 'g'; ft_config = test_flag 'c';
-                      ft_mode = mode;
+                      ft_mode = mode; ft_size = size;
                     })
         | _ ->
             eprintf "febootstrap: bad output from rpm command: '%s'" line;
@@ -189,7 +200,8 @@ let rec yum_rpm_list_files pkg =
       let dirs =
         List.map (fun name ->
                     name, { ft_dir = true; ft_ghost = false;
-                            ft_config = false; ft_mode = 0o40755 }) dirs in
+                            ft_config = false; ft_mode = 0o40755;
+                           ft_size = 0 }) dirs in
       let devs = [ "/dev/null"; "/dev/full"; "/dev/zero"; "/dev/random";
                    "/dev/urandom"; "/dev/tty"; "/dev/console";
                    "/dev/ptmx"; "/dev/stdin"; "/dev/stdout"; "/dev/stderr" ] in
@@ -197,7 +209,8 @@ let rec yum_rpm_list_files pkg =
       let devs =
         List.map (fun name ->
                     name, { ft_dir = false; ft_ghost = false;
-                            ft_config = false; ft_mode = 0o644 }) devs in
+                            ft_config = false; ft_mode = 0o644;
+                           ft_size = 0 }) devs in
       dirs @ devs @ files
     ) else files in
 
@@ -208,7 +221,7 @@ let yum_rpm_get_file_from_package pkg file =
 
   let outfile = tmpdir // file in
   let cmd =
-    sprintf "rpm2cpio %s | (cd %s && cpio --quiet -id .%s)"
+    sprintf "umask 0000; rpm2cpio %s | (cd %s && cpio --quiet -id .%s)"
       (Filename.quote pkg) (Filename.quote tmpdir) (Filename.quote file) in
   run_command cmd;
   outfile