From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mailout07.t-online.de (mailout07.t-online.de [194.25.134.83]) by sourceware.org (Postfix) with ESMTPS id 3634139B602C for ; Wed, 12 May 2021 17:51:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 3634139B602C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=t-online.de Authentication-Results: sourceware.org; spf=none smtp.mailfrom=Christian.Franke@t-online.de Received: from fwd17.aul.t-online.de (fwd17.aul.t-online.de [172.20.27.64]) by mailout07.t-online.de (Postfix) with SMTP id 8A68D2DF19 for ; Wed, 12 May 2021 19:51:04 +0200 (CEST) Received: from [192.168.2.105] (VygLKrZT8hogbTPTh1yq3QqmdVzuM9rLNS1NgY-7-ZfeX8u39t85WeJyaAqyHSFZC6@[79.230.169.184]) by fwd17.t-online.de with (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384 encrypted) esmtp id 1lgt0d-0x6Pjs0; Wed, 12 May 2021 19:50:59 +0200 From: Christian Franke Subject: Re: [PATCH setup] Add new option '--compact-os' To: "cygwin-apps@cygwin.com" References: <5d57a3f5-b595-2196-12ed-1c409d46be2a@t-online.de> <02f5ecb0-433b-262d-f56e-c5394c5f07bd@dronecode.org.uk> Message-ID: Date: Wed, 12 May 2021 19:50:58 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 SeaMonkey/2.53.6 MIME-Version: 1.0 In-Reply-To: <02f5ecb0-433b-262d-f56e-c5394c5f07bd@dronecode.org.uk> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-ID: VygLKrZT8hogbTPTh1yq3QqmdVzuM9rLNS1NgY-7-ZfeX8u39t85WeJyaAqyHSFZC6 X-TOI-EXPURGATEID: 150726::1620841859-0000EBC3-9372C242/0/0 CLEAN NORMAL X-TOI-MSGID: 1dd10208-cca7-43ba-b774-163d6a79bc08 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00, FREEMAIL_FROM, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=no autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: cygwin-apps@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin package maintainer discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 12 May 2021 17:51:08 -0000 Jon Turney wrote: > On 08/05/2021 21:03, Christian Franke wrote: > ... > >> definitions are still missing in the current headers. > > Let me encourage you to submit those to MinGW-w64 so they end up in > the w32api package. Done: https://sourceforge.net/p/mingw-w64/mailman/message/37280923/ > >> Test results with 64bit Cygwin (Disk space used without / with >> --compact-os): >> >> Base installation: 135MiB / 66,1 MiB (-51%) >> Installation with g++, Mingw, Perl, Python, Tex, ...:  2.19GiB / >> 854MiB (-62%) >> >> Base installation with NTFS compression: 78.7MiB (results in >> significant file fragmentation, Compact OS does not) > > Nice. > > A few minor comments. > > >> ... >> @@ -0,0 +1,62 @@ >> +// >> +// compactos.cc >> +// >> +// Copyright (C) 2021 Christian Franke >> +// >> +// SPDX-License-Identifier: MIT >> +// >> + >> +#include "compactos.h" >> + >> +#ifndef FSCTL_SET_EXTERNAL_BACKING > > There should be a comment here saying "not yet provided by w32api" or > similar. ... or we wait for a release of w32api headers with the patch mentioned above :-) > >> ... >> +#ifndef COMPACTOS_H >> +#define COMPACTOS_H >> + >> +#ifndef _INC_WINDOWS > > I hope windows.h already has it's own include guard? Yes, _INC_WINDOWS should be removed. > > ... >> +bool io_stream_cygfile::compact_os_is_available = (OSMajorVersion () >> >= 10); > > The documentation seems a bit vague, but are we really expecting this > to work on Windows 10 1507? Not tested with 1507. With an old 1511 VBox VM, the command 'compact /C /EXE:LZX' works, so this I/O-control should work also. (BTW: Caution: 'compact /C /EXE:...' does not preserve last write time - this is IMO a bug) > >> ... >> -io_stream_cygfile::io_stream_cygfile (const std::string& name, const >> std::string& mode, mode_t perms) : fp(), lasterr (0), fname(), wname >> (NULL) >> +static bool >> +compactos_is_useless (const std::string& name) > > Something like 'compression_useful' might be a bit clearer? I intentionally selected 'useless' because the negation is only 'possibly_useful'. Compression might still "fail" with ERROR_COMPRESSION_NOT_BENEFICIAL. > >> +{ >> +  const char * const p = name.c_str(); >> +  if (!(!strncmp (p, "/bin/", 5) || !strncmp (p, "/sbin/", 6) || >> !strncmp (p, "/usr/", 5))) >> +    return true; /* File is not in R/O tree. */ >> +  const size_t len = name.size(); /* >= 5 */ >> +  if (!strcmp (p + (len - 4), ".dll") || !strcmp (p + (len - 3), >> ".so")) >> +    return true; /* Rebase will open file for writing which >> uncompresses the file. */ >> +  if (!strcmp (p + (len - 3), ".gz") || !strcmp (p + (len - 3), ".xz")) >> +    return true; /* File is already compressed. */ > > Is this an assertion that there are no .bz2, .lzma, .zst etc. files in > the install? > No, but there are only a few occurrences in packages (except src packages). Extension .bz2 occurs more often, so it should possibly be added. Adding all compression formats is IMO not worth the effort. Even applying the compression to all files would be safe. Any too small or non-compressible file would result in ERROR_COMPRESSION_NOT_BENEFICIAL. Any later open for write access would silently uncompress the file.