febootstrap/helper/init: Mount /proc if not already present.
[febootstrap.git] / febootstrap.ml
index 9ea9885..dc44d3d 100644 (file)
@@ -79,16 +79,24 @@ let () =
     let combine (name1, ft1, pkg1) (name2, ft2, pkg2) =
       (* Rules for combining files. *)
       if ft1.ft_config || ft2.ft_config then (
-        eprintf "febootstrap: error: %s is a config file which is listed in two packages (%s, %s)\n"
-          name1 pkg1 pkg2;
-        exit 1
-      );
-      if (ft1.ft_dir || ft2.ft_dir) && (not (ft1.ft_dir && ft2.ft_dir)) then (
+       (* It's a fairly frequent bug in Fedora for two packages to
+        * incorrectly list the same config file.  Allow this, provided
+        * the size of both files is 0.
+        *)
+       if ft1.ft_size = 0 && ft2.ft_size = 0 then
+         (name1, ft1, pkg1)
+       else (
+          eprintf "febootstrap: error: %s is a config file which is listed in two packages (%s, %s)\n"
+            name1 pkg1 pkg2;
+          exit 1
+       )
+      )
+      else if (ft1.ft_dir || ft2.ft_dir) && (not (ft1.ft_dir && ft2.ft_dir)) then (
         eprintf "febootstrap: error: %s appears as both directory and ordinary file (%s, %s)\n"
           name1 pkg1 pkg2;
         exit 1
-      );
-      if ft1.ft_ghost then
+      )
+      else if ft1.ft_ghost then
         (name2, ft2, pkg2)
       else
         (name1, ft1, pkg1)
@@ -126,7 +134,8 @@ let () =
             else (
               insert_dir parent;
               let newdir = (parent, { ft_dir = true; ft_config = false;
-                                      ft_ghost = false; ft_mode = 0o40755 },
+                                      ft_ghost = false; ft_mode = 0o40755;
+                                     ft_size = 0 },
                             "") in
               newdir :: loop parent
             )
@@ -140,12 +149,12 @@ let () =
   if false then (
     List.iter (
       fun (name, { ft_dir = dir; ft_ghost = ghost; ft_config = config;
-                   ft_mode = mode }, pkg) ->
-        printf "%s [%s%s%s%o] from %s\n" name
+                   ft_mode = mode; ft_size = size }, pkg) ->
+        printf "%s [%s%s%s%o %d] from %s\n" name
           (if dir then "dir " else "")
           (if ghost then "ghost " else "")
           (if config then "config " else "")
-          mode
+          mode size
           pkg
     ) files
   );