Mailing-List: contact cygwin-apps-help AT cygwin DOT com; run by ezmlm Sender: cygwin-apps-owner AT cygwin DOT com List-Subscribe: List-Archive: List-Post: List-Help: , Delivered-To: mailing list cygwin-apps AT cygwin DOT com Date: Thu, 07 Feb 2002 08:41:19 -0500 From: Jason Tishler Subject: setup.exe rebase patch To: Cygwin-Apps Mail-followup-to: Cygwin-Apps Message-id: <20020207134119.GB1804@dothill.com> MIME-version: 1.0 Content-type: multipart/mixed; boundary="Boundary_(ID_0KM9GO1FLuSiaP/OgXalZA)" 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 * 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)--