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