-
Notifications
You must be signed in to change notification settings - Fork 0
/
ConsoleApplication1.cpp
139 lines (117 loc) · 4.92 KB
/
ConsoleApplication1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <string>
#include <filesystem>
#include <direct.h>
#include <Windows.h>
namespace fs = std::filesystem;
// Function to check if a directory exists
bool directoryExists(const std::string& dir) {
DWORD attrib = GetFileAttributesA(dir.c_str());
return (attrib != INVALID_FILE_ATTRIBUTES && (attrib & FILE_ATTRIBUTE_DIRECTORY));
}
// Function to check if Git is installed by attempting to run a Git command
bool isGitInstalled() {
std::string command = "git --version";
FILE* pipe = _popen(command.c_str(), "r");
if (!pipe) {
return false;
}
char buffer[128];
std::string result = "";
while (!feof(pipe)) {
if (fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
_pclose(pipe);
return result.find("git version") != std::string::npos;
}
// Function to install Git using shell command
void installGit(const std::string& currentUserDir) {
std::string gitInstallerUrl = "https://github.com/git-for-windows/git/releases/download/v2.45.2.windows.1/Git-2.45.2-64-bit.exe";
std::string gitInstallerPath = currentUserDir + "\\GitInstaller.exe";
// Download Git installer
std::string downloadCommand = "powershell -command \"(New-Object System.Net.WebClient).DownloadFile('" + gitInstallerUrl + "', '" + gitInstallerPath + "')\"";
system(downloadCommand.c_str());
// Install Git
std::string installCommand = "\"" + gitInstallerPath + "\" /SILENT /NORESTART";
system(installCommand.c_str());
// Clean up
fs::remove(gitInstallerPath);
}
// Function to download and install Vcpkg using Git
void installVcpkg(const std::string& currentUserDir) {
std::string vcpkgRepoUrl = "https://github.com/microsoft/vcpkg.git";
std::string vcpkgDir = currentUserDir + "\\vcpkg";
// Clone Vcpkg repository using Git
std::string cloneCommand = "git clone " + vcpkgRepoUrl + " " + vcpkgDir;
system(cloneCommand.c_str());
// Bootstrap Vcpkg
std::string bootstrapCommand = vcpkgDir + "\\bootstrap-vcpkg.bat";
system(bootstrapCommand.c_str());
}
// Function to integrate Vcpkg with Visual Studio
void integrateVcpkgWithVisualStudio(const std::string& vcpkgDir) {
std::string integrateCommand = vcpkgDir + "\\vcpkg integrate install";
system(integrateCommand.c_str());
}
int main() {
// Get the current user's directory
std::string currentUserDir = getenv("USERPROFILE");
std::string vcpkgDir = currentUserDir + "\\vcpkg";
// Check if Git is installed
if (!isGitInstalled()) {
std::cout << "Git is not installed. Installing..." << std::endl;
installGit(currentUserDir);
}
else {
std::cout << "Git is already installed." << std::endl;
}
// Check if Vcpkg is installed
if (!directoryExists(vcpkgDir)) {
std::cout << "Vcpkg is not installed. Installing..." << std::endl;
installVcpkg(currentUserDir);
}
// Change directory to vcpkg directory
int result = _chdir(vcpkgDir.c_str());
if (result != 0) {
std::cerr << "Failed to change directory to vcpkg directory." << std::endl;
return 1;
}
// Integrate Vcpkg with Visual Studio
integrateVcpkgWithVisualStudio(vcpkgDir);
std::cout << "Setup complete. Vcpkg is now integrated with Visual Studio." << std::endl;
// Loop to accept user input commands
std::string command;
while (true) {
std::cout << "\n";
std::cout << "Enter a command ('install libraryname', 'delete libraryname', 'exit' to quit): ";
std::getline(std::cin, command);
if (command == "exit") {
break;
}
else if (command.find("install ") == 0) {
std::string libraryName = command.substr(8); // Extract library name after "install "
std::string installCommand = ".\\vcpkg install " + libraryName;
std::cout << "Executing command: " << installCommand << std::endl;
system(installCommand.c_str());
}
else if (command.find("delete ") == 0) {
std::string libraryName = command.substr(7); // Extract library name after "delete "
std::string deleteCommand = ".\\vcpkg remove " + libraryName;
std::cout << "Executing command: " << deleteCommand << std::endl;
system(deleteCommand.c_str());
// Clean up residual files after deletion
std::string packageDir = ".\\vcpkg\\packages\\" + libraryName + "*";
for (const auto& entry : fs::directory_iterator(packageDir)) {
std::cout << "Removing residual file: " << entry.path() << std::endl;
fs::remove_all(entry.path());
}
}
else {
std::cerr << "Invalid command." << std::endl;
}
}
return 0;
}