alternate_version_generator_main.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Use of this source code is governed by a BSD-style license that can be 3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// found in the LICENSE file. 4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// This file provides a command-line interface to 6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// upgrade_test::GenerateAlternateVersion(). 7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <cstdio> 9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <cstdlib> 10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/at_exit.h" 12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/basictypes.h" 13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/command_line.h" 14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/files/file_path.h" 15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/files/file_util.h" 16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/logging.h" 17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "base/path_service.h" 18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "chrome/installer/test/alternate_version_generator.h" 19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingernamespace { 21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst wchar_t kDefaultMiniInstallerFile[] = L"mini_installer.exe"; 23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst wchar_t kDefaultOutPath[] = L"mini_installer_new.exe"; 24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingernamespace switches { 26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst char kForce[] = "force"; 28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst char kHelp[] = "help"; 29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst char kMiniInstaller[] = "mini_installer"; 30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst char kOut[] = "out"; 31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst char kPrevious[] = "previous"; 32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} // namespace switches 34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingernamespace errors { 36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerenum ErrorCode { 38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger SHOW_HELP, 39d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger MINI_INSTALLER_NOT_FOUND, 40d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger OUT_FILE_EXISTS, 41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GENERATION_FAILED 42d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger}; 43d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger 44d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemmingerconst wchar_t* const Messages[] = { 45d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger NULL, 46d27b1b5b41659d7b62f2e9f5213ffcefcad9753cnet[shemminger]!shemminger L"original mini_installer.exe not found", 47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger L"output file already exists", 48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger L"failed to generate a newly versioned mini_installer.exe" 49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}; 50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerconst wchar_t* GetErrorMessage(ErrorCode error_code) { 52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger DCHECK_LE(0, error_code); 53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger DCHECK_GT(arraysize(Messages), static_cast<size_t>(error_code)); 54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return Messages[error_code]; 55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} // namespace errors 58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Display usage information to stderr along with an optional error message with 60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// details. 61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid DumpUsage(const CommandLine& cmd_line, 62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger errors::ErrorCode error_code, 63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const std::wstring& detail) { 64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger const wchar_t* error_message = errors::GetErrorMessage(error_code); 65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (error_message != NULL) { 66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fwprintf(stderr, L"%s: %s", cmd_line.GetProgram().value().c_str(), 67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger errors::GetErrorMessage(error_code)); 68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!detail.empty()) 69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fwprintf(stderr, L" (%s)\n", detail.c_str()); 70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fwprintf(stderr, L"\n"); 72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fwprintf(stderr, 75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL"Usage: %s [ OPTIONS ]\n" 76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" Where OPTIONS is one or more of:\n" 77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" --help Display this help message.\n" 78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" --force Overwrite any existing output files.\n" 79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" --mini_installer=SRC_PATH Path to mini_installer.exe. Default value is\n" 80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" \"mini_installer.exe\" in the same directory as\n" 81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" this program.\n" 82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" --out=OUT_PATH Path to output file. Default value is\n" 83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" \"mini_installer_new.exe\" in the current\n" 84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" directory.\n" 8571058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemmingerL" --previous OUT_PATH will have a lower version than\n" 86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" SRC_PATH. By default, OUT_PATH will have a\n" 87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" higher version.\n" 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" --7za_path=7ZA_PATH Path to the directory holding 7za.exe. Defaults\n" 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" to ..\\..\\third_party\\lzma_sdk\\Executable\n" 90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerL" relative to this program's location.\n", 9171058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger cmd_line.GetProgram().value().c_str()); 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Gets the path to the source mini_installer.exe on which to operate, putting 95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// the result in |mini_installer|. Returns true on success. 96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerbool GetMiniInstallerPath(const CommandLine& cmd_line, 97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger base::FilePath* mini_installer) { 98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger DCHECK(mini_installer); 99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger base::FilePath result = cmd_line.GetSwitchValuePath(switches::kMiniInstaller); 100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (result.empty() && PathService::Get(base::DIR_EXE, &result)) 101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger result = result.Append(kDefaultMiniInstallerFile); 102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (result.empty()) 103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return false; 104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *mini_installer = result; 105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return true; 106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// Gets the path to the output file, putting the result in |out|. 109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingervoid GetOutPath(const CommandLine& cmd_line, base::FilePath* out) { 110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger DCHECK(out); 111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger base::FilePath result = cmd_line.GetSwitchValuePath(switches::kOut); 11271058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger if (result.empty()) 113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *out = base::FilePath(kDefaultOutPath); 114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *out = result; 116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 11871058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger// Returns the direction in which the version should be adjusted. 11971058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemmingerupgrade_test::Direction GetDirection(const CommandLine& cmd_line) { 120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return cmd_line.HasSwitch(switches::kPrevious) ? 121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger upgrade_test::PREVIOUS_VERSION : upgrade_test::NEXT_VERSION; 122aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} // namespace 125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger// The main program. 127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint wmain(int argc, wchar_t *argv[]) { 128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger base::AtExitManager exit_manager; 129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger CommandLine::Init(0, NULL); 130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger CommandLine* cmd_line = CommandLine::ForCurrentProcess(); 131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (cmd_line->HasSwitch(switches::kHelp)) { 13371058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger DumpUsage(*cmd_line, errors::SHOW_HELP, std::wstring()); 134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return EXIT_SUCCESS; 135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger base::FilePath mini_installer; 138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!GetMiniInstallerPath(*cmd_line, &mini_installer)) { 139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger DumpUsage(*cmd_line, errors::MINI_INSTALLER_NOT_FOUND, std::wstring()); 140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return EXIT_FAILURE; 141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 142aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 143ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger if (!base::PathExists(mini_installer)) { 144ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger DumpUsage(*cmd_line, errors::MINI_INSTALLER_NOT_FOUND, 145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mini_installer.value()); 146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return EXIT_FAILURE; 147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger base::FilePath out; 150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger GetOutPath(*cmd_line, &out); 151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!cmd_line->HasSwitch(switches::kForce) && base::PathExists(out)) { 152ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger DumpUsage(*cmd_line, errors::OUT_FILE_EXISTS, out.value()); 153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return EXIT_FAILURE; 154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 15571058eb8ef128aa99666dc4e6664e7632e12a1b9osdl.net!shemminger 156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger upgrade_test::Direction direction = GetDirection(*cmd_line); 157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger std::wstring original_version; 159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger std::wstring new_version; 160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (upgrade_test::GenerateAlternateVersion(mini_installer, out, direction, 162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger &original_version, &new_version)) { 163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fwprintf(stdout, L"Generated version %s from version %s\n", 164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger new_version.c_str(), original_version.c_str()); 165ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger return EXIT_SUCCESS; 166ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger } 167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger DumpUsage(*cmd_line, errors::GENERATION_FAILED, mini_installer.value()); 169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return EXIT_FAILURE; 170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger