www.delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin-apps/2002/02/07/08:36:57

Mailing-List: contact cygwin-apps-help AT cygwin DOT com; run by ezmlm
Sender: cygwin-apps-owner AT cygwin DOT com
List-Subscribe: <mailto:cygwin-apps-subscribe AT cygwin DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin-apps/>
List-Post: <mailto:cygwin-apps AT cygwin DOT com>
List-Help: <mailto:cygwin-apps-help AT cygwin DOT com>, <http://sources.redhat.com/lists.html#faqs>
Delivered-To: mailing list cygwin-apps AT cygwin DOT com
Date: Thu, 07 Feb 2002 08:41:19 -0500
From: Jason Tishler <jason AT tishler DOT net>
Subject: setup.exe rebase patch
To: Cygwin-Apps <cygwin-apps AT sources DOT redhat DOT com>
Mail-followup-to: Cygwin-Apps <cygwin-apps AT sources DOT redhat DOT com>
Message-id: <20020207134119.GB1804@dothill.com>
MIME-version: 1.0
User-Agent: Mutt/1.3.24i

--Boundary_(ID_0KM9GO1FLuSiaP/OgXalZA)
Content-type: text/plain; charset=us-ascii
Content-transfer-encoding: 7BIT
Content-disposition: inline

Attached is a patch that adds the rebase functionality to setup.exe.
I would like to get some feedback before I start to resolve the following
issues:

    o How to handle a missing config file (i.e., /etc/setup/rebase.conf)?
    o Need to handle in-use files.
    o How to handle corruptible (by rebasing) files?
    o How should dependent DLLs be handled?

and some other more niggling items.

I re-installed 30 out of the 33 packages that contain DLLs and my system
is functioning normally.  Python can even fork too!  I only skipped curl,
postgresql, and rxvt because the DLLs contained by these packages get
corrupted by rebasing.

If you would like to test out a setup.exe which includes the rebase
functionality, then a pre-built version is available at:

    http://www.tishler.net/jason/software/setup-rebase/setup-rebase-2002-02-02-1.exe

Before you run this setup.exe, you should download the default rebase
configuration file:

    http://www.tishler.net/jason/software/setup-rebase/rebase.conf

to /etc/setup.

I also have a stand-alone rebase.exe that I would like to contribute to
Cygwin so that users can rebase without having to run setup.exe.

Here is the current usage statement from rebase.exe:

    usage: rebase [-i|-r|-u] [-d CygwinRootDir] ImageFileName ...
    where:
        -i => install ImageFileName(s)
        -r => re-install ImageFileName(s) (default)
        -u => uninstall ImageFileName(s)
        -d => set Cygwin root directory (defaults to ".")

A pre-built version of rebase.exe is available at:

    http://www.tishler.net/jason/software/setup-rebase/rebase.exe

I see the following uses for this program:

    o makefiles
    o resync system (hopefully never needed)
    o used by a one-shot converter script

The following is an example of a postinstall script, rebase.bat, that
could rebase the entire user's system without have to reinstall
"everything":

    gzip -d -c /etc/setup/*.lst.gz | grep "\.dll$" | sed "s=^=/=" | xargs -n 1 cygpath -wa >rebase.tmp
    rebase -r -f rebase.tmp
    del rebase.tmp

The above assumes that I have added a "-f" option to rebase.exe and
changed the default value for the "-d" option to be the Cygwin root
directory obtained from the Registry.

Any feedback on the above would be greatly appreciated.

Thanks,
Jason

--Boundary_(ID_0KM9GO1FLuSiaP/OgXalZA)
Content-type: text/plain; charset=us-ascii; NAME=rebase.patch
Content-transfer-encoding: 7BIT
Content-disposition: attachment; filename=rebase.patch

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/winsup/cinstall/Makefile.in,v
retrieving revision 2.49
diff -u -p -r2.49 Makefile.in
--- Makefile.in	2002/01/27 06:36:06	2.49
+++ Makefile.in	2002/02/07 11:58:26
@@ -69,11 +69,12 @@ libmingw32.a	:= $(mingw_build)/libmingw3
 libuser32	:= $(w32api_lib)/libuser32.a
 libkernel32	:= $(w32api_lib)/libkernel32.a
 libcomctl32	:= $(w32api_lib)/libcomctl32.a
+libimagehlp	:= $(w32api_lib)/libimagehlp.a
 
 ALL_DEP_LDLIBS	:= $(ZLIB) $(BZ2LIB) $(w32api_lib)/libole32.a $(w32api_lib)/libwsock32.a \
 		$(w32api_lib)/libnetapi32.a $(w32api_lib)/libadvapi32.a \
 		$(w32api_lib)/libuuid.a $(libkernel32) $(libuser32) \
-		$(libcomctl32) $(libmingw32)
+		$(libcomctl32) $(libimagehlp) $(libmingw32)
 
 ALL_LDLIBS	:= ${patsubst $(mingw_build)/lib%.a,-l%,\
 	      ${patsubst $(w32api_lib)/lib%.a,-l%,\
@@ -99,13 +100,17 @@ OBJS = \
 	compress_bz.o \
 	compress_gz.o \
 	concat.o \
+	config_file.o \
+	config_file_reader.o \
+	config_file_writer.o \
 	cygpackage.o \
 	desktop.o \
 	dialog.o \
 	diskfull.o \
 	download.o \
-	find.o \
 	filemanip.o \
+	find.o \
+	free_list.o \
 	fromcwd.o \
 	geturl.o \
 	hash.o \
@@ -120,6 +125,7 @@ OBJS = \
 	localdir.o \
 	log.o \
 	main.o \
+	main.o \
 	mingw_getopt.o \
 	mkdir.o \
 	mklink2.o \
@@ -127,10 +133,10 @@ OBJS = \
 	msg.o \
 	net.o \
 	netio.o \
-	nio-ie5.o \
 	nio-file.o \
 	nio-ftp.o \
 	nio-http.o \
+	nio-ie5.o \
 	package_db.o \
 	package_meta.o \
 	package_source.o \
@@ -142,6 +148,7 @@ OBJS = \
 	postinstall.o \
 	proppage.o \
 	propsheet.o \
+	rebaser.o \
 	res.o \
 	rfc1738.o \
 	root.o \
@@ -153,6 +160,7 @@ OBJS = \
 	splash.o \
 	state.o \
 	threebar.o \
+	used_list.o \
 	version.o \
 	win32.o \
 	window.o \
Index: install.cc
===================================================================
RCS file: /cvs/src/src/winsup/cinstall/install.cc,v
retrieving revision 2.39
diff -u -p -r2.39 install.cc
--- install.cc	2002/01/27 06:36:06	2.39
+++ install.cc	2002/02/07 11:58:32
@@ -62,6 +62,7 @@ static const char *cvsid = "\n%%% $Id: i
 #include "package_source.h"
 
 #include "port.h"
+#include "rebaser.h"
 
 #include "threebar.h"
 extern ThreeBarProgressPage Progress;
@@ -291,6 +292,8 @@ install_one_source (packagemeta & pkgm, 
 		    }
 		}
 	    }
+	  else
+	    rebaser::get_instance ()->rerebase (cygpath (prefixPath, fn, 0));
 
 	  progress (tmp->tell ());
 	  num_installs++;
Index: log.cc
===================================================================
RCS file: /cvs/src/src/winsup/cinstall/log.cc,v
retrieving revision 2.7
diff -u -p -r2.7 log.cc
--- log.cc	2002/01/22 12:30:50	2.7
+++ log.cc	2002/02/07 11:58:32
@@ -34,6 +34,7 @@ static const char *cvsid =
 #include "concat.h"
 #include "mkdir.h"
 #include "mount.h"
+#include "rebaser.h"
 
 struct LogEnt
 {
@@ -116,6 +117,8 @@ exit_setup (int exit_code)
 
   if (exit_msg)
     note (NULL, exit_msg);
+
+  rebaser::delete_instance ();
 
   log (LOG_TIMESTAMP, "Ending cygwin install");
 
Index: package_meta.cc
===================================================================
RCS file: /cvs/src/src/winsup/cinstall/package_meta.cc,v
retrieving revision 2.15
diff -u -p -r2.15 package_meta.cc
--- package_meta.cc	2002/01/22 09:03:55	2.15
+++ package_meta.cc	2002/02/07 11:58:32
@@ -42,6 +42,7 @@ static const char *cvsid = "\n%%% $Id: p
 #include "cygpackage.h"
 #include "package_meta.h"
 #include "package_db.h"
+#include "rebaser.h"
 
 static const char *standard_dirs[] = {
   "/bin",
@@ -167,6 +168,7 @@ packagemeta::uninstall ()
 	      log (LOG_BABBLE, "unlink %s", d);
 	      SetFileAttributes (d, dw & ~FILE_ATTRIBUTE_READONLY);
 	      DeleteFile (d);
+	      rebaser::get_instance ()->unrebase (d);
 	    }
 	  /* Check for Windows shortcut of same name. */
 	  d = concat (d, ".lnk", NULL);
Index: root.cc
===================================================================
RCS file: /cvs/src/src/winsup/cinstall/root.cc,v
retrieving revision 2.8
diff -u -p -r2.8 root.cc
--- root.cc	2001/12/23 12:13:29	2.8
+++ root.cc	2002/02/07 11:58:32
@@ -36,6 +36,7 @@ static const char *cvsid =
 #include "concat.h"
 #include "log.h"
 #include "root.h"
+#include "rebaser.h"
 
 static int rb[] = { IDC_ROOT_TEXT, IDC_ROOT_BINARY, 0 };
 static int su[] = { IDC_ROOT_SYSTEM, IDC_ROOT_USER, 0 };
@@ -180,6 +181,8 @@ RootPage::OnNext ()
     return -1;
 
   NEXT (IDD_LOCAL_DIR);
+
+  rebaser::set_cygwin_root_dir (get_root_dir ());
 
   log (0, "root: %s %s %s", get_root_dir (),
        (root_text == IDC_ROOT_TEXT) ? "text" : "binary",

--Boundary_(ID_0KM9GO1FLuSiaP/OgXalZA)
Content-type: text/plain; charset=us-ascii; NAME=rebase.ChangeLog
Content-transfer-encoding: 7BIT
Content-disposition: attachment; filename=rebase.ChangeLog

2002-02-07  Jason Tishler  <jason AT tishler DOT net>

	* Makefile.in (libimagehlp): New variable.
	(ALL_DEP_LDLIBS): Add libimagehlp.
	(OBJ): Add rebase objects.  Resort objects.
	* install.cc (install_one_source): Add call to rebaser::rerebase.
	* log.cc (exit_setup): Add call to rebaser::delete_instance.
	* package_meta.cc (packagemeta::uninstall): Add call to
	rebaser::unrebase.
	* root.cc (RootPage::OnNext): Add call to rebaser::set_cygwin_root_dir.
	* config_file.cc: New file.
	* config_file.h: New file.
	* config_file_reader.cc: New file.
	* config_file_reader.h: New file.
	* config_file_writer.cc: New file.
	* config_file_writer.h: New file.
	* free_list.cc: New file.
	* free_list.h: New file.
	* rebaser.cc: New file.
	* rebaser.h: New file.
	* used_list.cc: New file.
	* used_list.h: New file.

--Boundary_(ID_0KM9GO1FLuSiaP/OgXalZA)
Content-type: application/octet-stream; NAME=rebase.tar.bz2
Content-transfer-encoding: base64
Content-disposition: attachment; filename=rebase.tar.bz2

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
hgeGqqqqrkEB/i7kinChIWQfGio=

--Boundary_(ID_0KM9GO1FLuSiaP/OgXalZA)--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019