Mercurial > hg > xemacs-beta
comparison netinstall/fromcwd.cc @ 448:3078fd1074e8 r21-2-39
Import from CVS: tag r21-2-39
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:38:25 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
447:4fc5f13f3bd3 | 448:3078fd1074e8 |
---|---|
1 /* | |
2 * Copyright (c) 2000, Red Hat, Inc. | |
3 * | |
4 * This program is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * A copy of the GNU General Public License can be found at | |
10 * http://www.gnu.org/ | |
11 * | |
12 * Written by DJ Delorie <dj@cygnus.com> | |
13 * | |
14 */ | |
15 | |
16 /* The purpose of this file is to handle the case where we're | |
17 installing from files that already exist in the current directory. | |
18 If a setup.ini file is present, we set the mirror site to "." and | |
19 pretend we're installing from the `internet' ;-) else we have to | |
20 find all the .tar.gz files, deduce their versions, and try to | |
21 compare versions in the case where the current directory contains | |
22 multiple versions of any given package. We do *not* try to compare | |
23 versions with already installed packages; we always choose a | |
24 package in the current directory over one that's already installed | |
25 (otherwise, why would you have asked to install it?). Note | |
26 that we search recursively. */ | |
27 | |
28 #include "win32.h" | |
29 | |
30 #include <stdio.h> | |
31 #include <stdlib.h> | |
32 #include <io.h> | |
33 #include <ctype.h> | |
34 #ifndef WIN32_NATIVE | |
35 #include <unistd.h> | |
36 #endif | |
37 | |
38 #include "ini.h" | |
39 #include "resource.h" | |
40 #include "concat.h" | |
41 #include "state.h" | |
42 #include "dialog.h" | |
43 #include "msg.h" | |
44 #include "find.h" | |
45 #include "version.h" | |
46 | |
47 #include "port.h" | |
48 | |
49 static int | |
50 is_test_version (char *v) | |
51 { | |
52 int i; | |
53 for (i=0; v[i] && isdigit (v[i]); i++) ; | |
54 return (i >= 6) ? 1 : 0; | |
55 } | |
56 | |
57 char * | |
58 canonicalize_version (char *v) | |
59 { | |
60 static char nv[3][100]; | |
61 static int idx = 0; | |
62 char *np, *dp; | |
63 int i; | |
64 | |
65 idx = (idx+1) % 3; | |
66 np = nv[idx]; | |
67 | |
68 while (*v) | |
69 { | |
70 if (isdigit (*v)) | |
71 { | |
72 for (dp=v; *dp && isdigit (*dp); dp++) ; | |
73 for (i=dp-v; i<12; i++) | |
74 *np++ = '0'; | |
75 while (v < dp) | |
76 *np++ = *v++; | |
77 } | |
78 else | |
79 *np++ = *v++; | |
80 } | |
81 *np++ = 0; | |
82 return nv[idx]; | |
83 } | |
84 | |
85 static void | |
86 found_file (char *path, unsigned int fsize) | |
87 { | |
88 char base[_MAX_PATH], *ver; | |
89 | |
90 int l = strlen (path); | |
91 | |
92 if (strcmp (path + l - 7, ".tar.gz") != 0) | |
93 return; | |
94 if (strstr (path, "-src.")) | |
95 return; | |
96 if (strstr (path, "-patch.")) | |
97 return; | |
98 | |
99 char *sl = strrchr (path, '/'); | |
100 if (sl) | |
101 sl ++; | |
102 else | |
103 sl = path; | |
104 strcpy (base, sl); | |
105 base[strlen (base) - 7] = 0; /* remove .tar.gz */ | |
106 for (ver=base; *ver; ver++) | |
107 if ((*ver == '-' || *ver == '_') && isdigit (ver[1])) | |
108 { | |
109 *ver++ = 0; | |
110 break; | |
111 } | |
112 | |
113 Package *p = 0; | |
114 int i; | |
115 | |
116 for (i=0; i<npackages; i++) | |
117 if (strcmp (package[i].name, base) == 0) | |
118 { | |
119 p = package + i; | |
120 break; | |
121 } | |
122 if (p == 0) | |
123 p = new_package (strdup (base)); | |
124 | |
125 int trust = is_test_version (ver) ? TRUST_TEST : TRUST_CURR; | |
126 if (!*ver) | |
127 trust = TRUST_PREV; | |
128 | |
129 /* See if this version is older than what we have */ | |
130 if (p->info[trust].version) | |
131 { | |
132 char *ov = canonicalize_version (p->info[trust].version); | |
133 char *nv = canonicalize_version (ver); | |
134 if (strcmp (ov, nv) > 0) | |
135 return; | |
136 } | |
137 | |
138 l = strlen (base); | |
139 if (l >= 5 && strcmp (base + l - 5, "win32") == 0) | |
140 p->type = TY_NATIVE; | |
141 if (l >= 8 && strcmp (base + l - 8, "cygwin32") == 0) | |
142 p->type = TY_CYGWIN; | |
143 | |
144 p->info[trust].version = strdup (ver); | |
145 p->info[trust].install = strdup (path); | |
146 p->info[trust].install_size = fsize; | |
147 } | |
148 | |
149 void | |
150 do_fromcwd (HINSTANCE h) | |
151 { | |
152 if (_access ("./setup.ini", 0) == 0) | |
153 { | |
154 mirror_site = "."; | |
155 next_dialog = IDD_S_LOAD_INI; | |
156 return; | |
157 } | |
158 | |
159 next_dialog = IDD_CHOOSE; | |
160 | |
161 find (".", found_file); | |
162 | |
163 // Now see about source tarballs | |
164 int i, t; | |
165 Package *p; | |
166 char srcpath[_MAX_PATH]; | |
167 for (i=0; i<npackages; i++) | |
168 { | |
169 p = package+i; | |
170 for (t=TRUST_PREV; t<=TRUST_TEST; t++) | |
171 if (p->info[t].install) | |
172 { | |
173 strcpy (srcpath, p->info[t].install); | |
174 strcpy (srcpath + strlen (srcpath) - 7, "-src.tar.gz"); | |
175 msg ("looking for %s", srcpath); | |
176 | |
177 WIN32_FIND_DATA wfd; | |
178 HANDLE h = FindFirstFile (srcpath, &wfd); | |
179 if (h != INVALID_HANDLE_VALUE) | |
180 { | |
181 msg("-- got it"); | |
182 FindClose (h); | |
183 p->info[t].source = strdup (srcpath); | |
184 p->info[t].source_size = wfd.nFileSizeLow; | |
185 } | |
186 } | |
187 } | |
188 | |
189 return; | |
190 } |