Initial revision
[chise/xemacs-chise.git.1] / netinstall / fromcwd.cc
diff --git a/netinstall/fromcwd.cc b/netinstall/fromcwd.cc
new file mode 100644 (file)
index 0000000..0fadb7b
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ * Copyright (c) 2000, Red Hat, Inc.
+ *
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ *
+ *     A copy of the GNU General Public License can be found at
+ *     http://www.gnu.org/
+ *
+ * Written by DJ Delorie <dj@cygnus.com>
+ *
+ */
+
+/* The purpose of this file is to handle the case where we're
+   installing from files that already exist in the current directory.
+   If a setup.ini file is present, we set the mirror site to "." and
+   pretend we're installing from the `internet' ;-) else we have to
+   find all the .tar.gz files, deduce their versions, and try to
+   compare versions in the case where the current directory contains
+   multiple versions of any given package.  We do *not* try to compare
+   versions with already installed packages; we always choose a
+   package in the current directory over one that's already installed
+   (otherwise, why would you have asked to install it?).  Note
+   that we search recursively. */
+
+#include "win32.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <io.h>
+#include <ctype.h>
+#ifndef WIN32_NATIVE
+#include <unistd.h>
+#endif
+
+#include "ini.h"
+#include "resource.h"
+#include "concat.h"
+#include "state.h"
+#include "dialog.h"
+#include "msg.h"
+#include "find.h"
+#include "version.h"
+
+#include "port.h"
+
+static int
+is_test_version (char *v)
+{
+  int i;
+  for (i=0; v[i] && isdigit (v[i]); i++) ;
+  return (i >= 6) ? 1 : 0;
+}
+
+char *
+canonicalize_version (char *v)
+{
+  static char nv[3][100];
+  static int idx = 0;
+  char *np, *dp;
+  int i;
+
+  idx = (idx+1) % 3;
+  np = nv[idx];
+
+  while (*v)
+    {
+      if (isdigit (*v))
+       {
+         for (dp=v; *dp && isdigit (*dp); dp++) ;
+         for (i=dp-v; i<12; i++)
+           *np++ = '0';
+         while (v < dp)
+           *np++ = *v++;
+       }
+      else
+       *np++ = *v++;
+    }
+  *np++ = 0;
+  return nv[idx];
+}
+
+static void
+found_file (char *path, unsigned int fsize)
+{
+  char base[_MAX_PATH], *ver;
+
+  int l = strlen (path);
+
+  if (strcmp (path + l - 7, ".tar.gz") != 0)
+    return;
+  if (strstr (path, "-src."))
+    return;
+  if (strstr (path, "-patch."))
+    return;
+
+  char *sl = strrchr (path, '/');
+  if (sl)
+    sl ++;
+  else
+    sl = path;
+  strcpy (base, sl);
+  base[strlen (base) - 7] = 0; /* remove .tar.gz */
+  for (ver=base; *ver; ver++)
+    if ((*ver == '-' || *ver == '_') && isdigit (ver[1]))
+      {
+       *ver++ = 0;
+       break;
+      }
+
+  Package *p = 0;
+  int i;
+
+  for (i=0; i<npackages; i++)
+    if (strcmp (package[i].name, base) == 0)
+      {
+       p = package + i;
+       break;
+      }
+  if (p == 0)
+      p = new_package (strdup (base));
+
+  int trust = is_test_version (ver) ? TRUST_TEST : TRUST_CURR;
+  if (!*ver)
+    trust = TRUST_PREV;
+
+  /* See if this version is older than what we have */
+  if (p->info[trust].version)
+    {
+      char *ov = canonicalize_version (p->info[trust].version);
+      char *nv = canonicalize_version (ver);
+      if (strcmp (ov, nv) > 0)
+       return;
+    }
+
+  l = strlen (base);
+  if (l >= 5 && strcmp (base + l - 5, "win32") == 0)
+    p->type = TY_NATIVE;
+  if (l >= 8 && strcmp (base + l - 8, "cygwin32") == 0)
+    p->type = TY_CYGWIN;
+
+  p->info[trust].version = strdup (ver);
+  p->info[trust].install = strdup (path);
+  p->info[trust].install_size = fsize;
+}
+
+void
+do_fromcwd (HINSTANCE h)
+{
+  if (_access ("./setup.ini", 0) == 0)
+    {
+      mirror_site = ".";
+      next_dialog = IDD_S_LOAD_INI;
+      return;
+    }
+
+  next_dialog = IDD_CHOOSE;
+
+  find (".", found_file);
+
+  // Now see about source tarballs
+  int i, t;
+  Package *p;
+  char srcpath[_MAX_PATH];
+  for (i=0; i<npackages; i++)
+    {
+      p = package+i;
+      for (t=TRUST_PREV; t<=TRUST_TEST; t++)
+       if (p->info[t].install)
+         {
+           strcpy (srcpath, p->info[t].install);
+           strcpy (srcpath + strlen (srcpath) - 7, "-src.tar.gz");
+           msg ("looking for %s", srcpath);
+
+           WIN32_FIND_DATA wfd;
+           HANDLE h = FindFirstFile (srcpath, &wfd);
+           if (h != INVALID_HANDLE_VALUE)
+             {
+               msg("-- got it");
+               FindClose (h);
+               p->info[t].source = strdup (srcpath);
+               p->info[t].source_size = wfd.nFileSizeLow;
+             }
+         }
+    }
+
+  return;
+}