mirror of
https://github.com/ip7z/7zip.git
synced 2026-04-21 06:03:40 +00:00
7 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
1eca44e7a7 |
v2026.3.22.0
English This patch addresses the review feedback around Windows installer metadata and update-path handling, and removes a partially implemented UI surface that duplicated the existing multi-output path controls. Installer / ARP metadata - The installer previously wrote fork-specific hardcoded values into the Windows Uninstall registry entry (`DisplayName`, `DisplayVersion`, `Publisher`). - That created drift between the installed product metadata and the actual upstream 7-Zip version/author macros used elsewhere in the tree. - The patch removes the hardcoded fork values and derives the registry values from the existing 7-Zip definitions: - `DisplayName` now uses the existing versioned product string (`7-Zip 26.00 (x64)` on 64-bit builds). - `DisplayVersion` now comes from `MY_VERSION`. - `Publisher` now comes from `MY_AUTHOR_NAME`. - This makes the Add/Remove Programs entry consistent with the rest of the build metadata and removes the need for manual source edits on each branch-specific release. Compression dialog cleanup - The `Paths...` button and its dedicated dialog were not part of the stable workflow. - At this point the main compression dialog already exposes the supported multi-output behavior through the output-count selector plus the existing archive path rows and browse buttons. - Keeping a second path-editing dialog in parallel would add maintenance overhead and duplicate UI/state management without providing new functionality. - For that reason, this patch removes the incomplete/duplicate surface entirely: - the `Paths...` button was removed from the dialog resource, - the handler declaration/definition was removed, - the auxiliary `COutputArcPathsDialog` class was removed, - the associated resource IDs and helper parsing/serialization code were removed. - Functional capability is unchanged: users still configure multiple output targets through the existing archive path controls already present in the compression dialog. Update path deduplication - In `UpdateGUI.cpp`, `AddUniquePath()` previously compared paths with a case-sensitive equality check. - On Windows, this could fail to deduplicate logically identical paths that differ only by casing. - The comparison is now case-insensitive (`IsEqualTo_NoCase()`), which matches expected Windows path behavior more closely and prevents duplicate item entries in the update/compression path collection stage. - This is intentionally a minimal fix: it addresses case-only duplication without changing the broader path normalization rules. Working directory safety - `PrepareWorkingDirForArchivePath()` previously ignored the return value of `MyGetFullPathName()`. - If full-path resolution failed, the code could continue with an invalid or empty path and derive an incorrect working directory. - The function now exits early when `MyGetFullPathName()` fails, leaving `options.WorkingDir` empty. - This is a conservative change: the downstream update flow already has fallback behavior for an empty working directory, so the patch avoids propagating bad path state without altering the existing fallback model. Header consistency / non-functional cleanup - `LangUtils.h` now provides a non-`Z7_LANG` fallback declaration for `LangString_OnlyFromLangFile()`. - This is not a functional runtime change for normal localized builds, but it keeps the header interface consistent across configurations and avoids IDE/static-analysis mismatches where `Z7_LANG` is not visible to the parser. Behavioral impact - No archive format logic was changed. - No codec behavior was changed. - No new persistence format was introduced. - The only runtime behavior changes are: - correct Windows ARP metadata, - removal of dead/duplicate UI, - case-insensitive deduplication of update input paths, - safer handling of full-path resolution failure before working directory derivation. Validation - The change set was validated with targeted code search and diff review to ensure the removed dialog/button plumbing no longer has remaining references. - `git diff --check` was also run on the touched files. - A full build/test pass has not yet been run in this environment. Portuguese Este patch responde ao feedback de revisão relacionado aos metadados do instalador no Windows e ao tratamento de caminhos no fluxo de atualização, além de remover uma superfície de UI parcialmente implementada que duplicava os controles já existentes para múltiplos caminhos de saída. Instalador / metadados do item no Windows - O instalador estava gravando valores hardcoded e específicos do fork na chave de desinstalação do Windows (`DisplayName`, `DisplayVersion`, `Publisher`). - Isso criava divergência entre os metadados exibidos em “Aplicativos instalados / Programas e Recursos” e as macros oficiais de versão/autoria já utilizadas no restante do código-fonte. - O patch remove esses valores fixos do fork e passa a derivar os valores diretamente das definições já existentes do 7-Zip: - `DisplayName` agora usa a string versionada já existente do produto (`7-Zip 26.00 (x64)` em builds 64-bit). - `DisplayVersion` agora vem de `MY_VERSION`. - `Publisher` agora vem de `MY_AUTHOR_NAME`. - Com isso, a entrada instalada no Windows fica consistente com os demais metadados do build e deixa de exigir edição manual do código a cada release da branch. Limpeza do diálogo de compressão - O botão `Paths...` e a dialog auxiliar associada não faziam parte de um fluxo estável/finalizado. - Neste momento, a janela principal de compressão já expõe o comportamento suportado de múltiplas saídas por meio do seletor de quantidade de saídas, dos campos de caminho de arquivo e dos botões de browse já existentes. - Manter uma segunda dialog para edição textual desses caminhos aumentaria o custo de manutenção e duplicaria a lógica de estado/UI sem adicionar capacidade funcional nova. - Por esse motivo, este patch remove completamente essa superfície incompleta/duplicada: - o botão `Paths...` foi removido do recurso da dialog, - a declaração e a implementação do handler foram removidas, - a classe auxiliar `COutputArcPathsDialog` foi removida, - os IDs de recurso associados e os helpers internos de parsing/serialização dessa dialog também foram removidos. - A capacidade funcional permanece a mesma: o usuário continua podendo configurar múltiplos destinos pelos controles de caminhos de saída já existentes na própria janela de compressão. Deduplicação de caminhos no fluxo de atualização - Em `UpdateGUI.cpp`, a função `AddUniquePath()` comparava caminhos usando igualdade case-sensitive. - Em Windows, isso podia falhar em deduplicar caminhos logicamente idênticos que diferiam apenas por maiúsculas/minúsculas. - A comparação agora é case-insensitive (`IsEqualTo_NoCase()`), o que se alinha melhor ao comportamento esperado para caminhos no Windows e evita entradas duplicadas durante a coleta dos caminhos de itens no fluxo de atualização/compressão. - A alteração foi mantida propositalmente mínima: ela corrige a duplicação por diferença de casing sem alterar as regras mais amplas de normalização de caminhos. Segurança na preparação do diretório de trabalho - `PrepareWorkingDirForArchivePath()` ignorava o valor de retorno de `MyGetFullPathName()`. - Se a resolução para caminho absoluto falhasse, o código poderia continuar com um caminho inválido ou vazio e, a partir disso, derivar um diretório de trabalho incorreto. - Agora a função retorna imediatamente quando `MyGetFullPathName()` falha, deixando `options.WorkingDir` vazio. - Essa mudança é conservadora: o fluxo subsequente de atualização já possui fallback quando o diretório de trabalho está vazio, então o patch evita propagar um estado inconsistente sem alterar o modelo de fallback já existente. Consistência de headers / limpeza não funcional - `LangUtils.h` agora fornece um fallback para `LangString_OnlyFromLangFile()` também quando `Z7_LANG` não está definido. - Isso não altera o comportamento funcional em builds localizados normais, mas mantém a interface do header consistente entre configurações e evita divergências em IDEs/analisadores estáticos quando `Z7_LANG` não está visível para o parser. Impacto comportamental - Nenhuma lógica de formato de arquivo foi alterada. - Nenhum comportamento de codec foi alterado. - Nenhum novo formato de persistência foi introduzido. - As únicas mudanças observáveis em runtime são: - correção dos metadados exibidos pelo Windows para a instalação, - remoção de uma UI morta/duplicada, - deduplicação case-insensitive de caminhos no fluxo de atualização, - tratamento mais seguro de falha ao resolver caminho absoluto antes de derivar o diretório de trabalho. Validação - O conjunto de alterações foi validado com buscas direcionadas no código e revisão de diff para garantir que a plumbing removida da dialog/botão não deixou referências residuais. - Também foi executado `git diff --check` nos arquivos alterados. - Ainda não foi executado um ciclo completo de build/testes neste ambiente. |
||
|
|
5a4388f2b8 |
v2026.3.21.0
**Arquivos-Chave** [CompressDialog.cpp](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/GUI/CompressDialog.cpp), [CompressDialog.h](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/GUI/CompressDialog.h), [CompressDialog.rc](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/GUI/CompressDialog.rc), [UpdateGUI.cpp](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/GUI/UpdateGUI.cpp), [Update.h](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/Common/Update.h), [LangUtils.cpp](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/UI/FileManager/LangUtils.cpp), [Build.mak](c:/Users/ferna/DEV/CPP/7zip/CPP/Build.mak), [makefile](c:/Users/ferna/DEV/CPP/7zip/CPP/7zip/Bundles/Fm/makefile), [7zipUninstall.c](c:/Users/ferna/DEV/CPP/7zip/C/Util/7zipUninstall/7zipUninstall.c), [7zipInstall.c](c:/Users/ferna/DEV/CPP/7zip/C/Util/7zipInstall/7zipInstall.c) **English** Suggested title: `Support multiple output archives, per-item packaging flow, and packaging/uninstall hardening` This PR extends the fork’s compression flow to support multiple output archives and, when the operation starts from multiple selected items, to execute per-item packaging with isolated destinations. The change is carried from the UI down to the options/execution layer, with safe initialization of the new state so the legacy behavior remains intact when the feature is not used. - The data model was extended to carry multiple destinations and item→archive mappings through `ArcPaths`, `SeparateItemMode`, `SeparateItemPaths`, `SeparateItemArchivePaths`, `ItemPaths`, `ItemOutputItemPaths`, and `ItemArcPaths`. - The compression dialog was reworked to accept up to 5 output paths, with an output-count selector, extra combo boxes, dynamic layout resizing, and per-item groups when multiple items are selected. - Archive name and extension handling was hardened: when the format or SFX state changes, the code removes the previous extension before appending the new one, preventing outputs such as `.7z.zip` or `.exe.exe`, while preserving `KeepName` formats and hash-based handlers. - Dialog finalization now validates empty and duplicate paths, normalizes final output paths, and blocks unsafe combinations with `Delete after compression`, especially when the same source item could feed more than one output. - The update pipeline no longer assumes a single `CUpdateArchiveCommand`. `UpdateGUI` now accepts multiple targets, recomputes `WorkingDir` per archive path, and, in separate-item mode, calls `UpdateArchive()` once per item/destination so failures stay isolated and the item-to-output mapping remains explicit. - Input items are now collected from the `censor` with explicit deduplication, keeping the actual UI selection aligned with the execution layer. - Language lookup and packaging were adapted for redistributed layouts: `LangUtils.cpp` now searches parent directories for `Lang`, while the File Manager bundle makefile copies language files into the relevant output folders. - The makefiles were hardened with explicit dependencies for the new resources, and `Build.mak` stops passing `$**` to `rc`, using only the target `.rc` file as the actual resource compiler input. - The uninstaller was strengthened for real Windows shell scenarios: it removes stale shell-extension CLSIDs first, tries to unload `7-zip.dll` and `7-zip32.dll` from `explorer.exe`, clears `read-only` attributes, removes `.tmp*` variants, schedules locked files for deletion after reboot, notifies shell association changes, and self-elevates with `runas`. - The installer now writes fork-specific uninstall metadata (`DisplayName`, `DisplayVersion`, `Publisher`), making it easier to distinguish the fork from the official build in Windows “Programs and Features”. Upstream note: the code already contains groundwork for a text-based output-path editor, but the corresponding UI entry point is currently hidden; the visible behavior today is the inline multi-output/per-item layout. The current `AboutDialog.*` files do not show a semantic diff and look like line-ending-only changes, so I would keep them out of the functional PR. Se quiser, eu também posso transformar isso no formato exato de corpo de PR do GitHub, com seções como `Summary`, `Motivation`, `Implementation Details`, `Risks` e `Validation`, já pronto para colar. **Português** Título sugerido: `Support multiple output archives, per-item packaging flow, and packaging/uninstall hardening` Este PR amplia o fluxo de compressão do fork para suportar múltiplos arquivos de saída e, quando a operação parte de múltiplos itens selecionados, executar um empacotamento item a item com isolamento de destino. A mudança foi propagada da UI até a camada de opções/execução, com inicialização segura dos novos estados para preservar o comportamento legado quando o recurso não é utilizado. - A estrutura de dados foi estendida para transportar múltiplos destinos e mapeamentos item→arquivo com `ArcPaths`, `SeparateItemMode`, `SeparateItemPaths`, `SeparateItemArchivePaths`, `ItemPaths`, `ItemOutputItemPaths` e `ItemArcPaths`. - A janela de compressão foi reestruturada para aceitar até 5 caminhos de saída, com contador de destinos, combos adicionais, redimensionamento dinâmico do layout e grupos por item quando há multi-seleção. - O tratamento de nomes e extensões foi endurecido: ao trocar formato ou SFX, o código remove a extensão anterior antes de anexar a nova, evitando resultados como `.7z.zip` ou `.exe.exe`, sem quebrar formatos `KeepName` ou handlers baseados em hash. - O fechamento do diálogo agora valida caminhos vazios e duplicados, normaliza caminhos finais e bloqueia combinações inseguras com `Delete after compression`, especialmente quando o mesmo item poderia alimentar múltiplos outputs. - O pipeline de update deixou de assumir um único `CUpdateArchiveCommand`. O `UpdateGUI` agora aceita vários destinos, recompõe `WorkingDir` por arquivo de saída e, em modo separado, executa `UpdateArchive()` individualmente por item/destino para isolar erros e preservar o vínculo entre item selecionado e arquivo gerado. - A coleta dos itens de entrada passou a ser feita a partir do `censor`, com deduplicação explícita, garantindo consistência entre a seleção real da UI e a execução. - O suporte a idiomas e empacotamento foi ajustado para layouts redistribuídos: `LangUtils.cpp` agora procura a pasta `Lang` subindo a árvore de diretórios, enquanto o bundle do File Manager copia os arquivos de idioma para os diretórios de saída relevantes. - Os makefiles foram fortalecidos com dependências explícitas dos novos recursos, e `Build.mak` deixou de passar `$**` ao `rc`, usando apenas o `.rc` alvo como entrada efetiva do compilador de recursos. - O desinstalador foi reforçado para cenários reais do Windows: remoção prévia de CLSIDs da shell extension, tentativa de descarregar `7-zip.dll` e `7-zip32.dll` do `explorer.exe`, limpeza de arquivos `read-only`, remoção de variantes `.tmp*`, agendamento para exclusão após reboot quando o arquivo está travado, notificação de alteração de associações e autoelevação com `runas`. - O instalador também passou a gravar metadados próprios do fork no registro de desinstalação (`DisplayName`, `DisplayVersion`, `Publisher`), facilitando a distinção entre o fork e a build oficial no painel “Programs and Features”. Nota para a equipe upstream: a infraestrutura de um editor textual de caminhos de saída já existe no código, mas a entrada visual correspondente permanece oculta; hoje, o comportamento efetivamente exposto é o layout inline com múltiplos destinos e o fluxo por item em multi-seleção. Os arquivos `AboutDialog.*` não exibem diff semântico no estado atual e parecem ser apenas normalização de fim de linha, então eu os separaria da PR funcional. |
||
|
|
395149956d | 25.00 | ||
|
|
fc662341e6 | 24.05 | ||
|
|
5b39dc76f1 | 23.01 | ||
|
|
93be7d4abf | 22.01 | ||
|
|
f19f813537 | '21.07' |