X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=netinstall%2Ffromcwd.cc;fp=netinstall%2Ffromcwd.cc;h=0fadb7badead5796739a98feb84e89265c6c79fe;hp=0000000000000000000000000000000000000000;hb=1ecbe603154527afa87c21523aedd8e3bda77c2f;hpb=131844b7560952b4f8e1cb8628d9115e0f2f29d2 diff --git a/netinstall/fromcwd.cc b/netinstall/fromcwd.cc new file mode 100644 index 0000000..0fadb7b --- /dev/null +++ b/netinstall/fromcwd.cc @@ -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 + * + */ + +/* 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 +#include +#include +#include +#ifndef WIN32_NATIVE +#include +#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; iinfo[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; iinfo[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; +}