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
|
#include <iostream>
#include <vector>
#include <string>
#include <boost/python.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <frameobject.h>
namespace py = boost::python;
namespace fs = boost::filesystem;
static const std::string UPDATES_DIR = "updates";
/**
Given two directories, it merges them by copying new files and
directories, and replacing existing files with the ones at the
destination
*/
void
mergeDirectories(const fs::path &source,
const fs::path &dest)
{
fs::path sourceDir(source);
fs::directory_iterator end_iter;
std::vector<fs::path> files;
if (fs::exists(sourceDir) && fs::is_directory(sourceDir))
{
for(fs::directory_iterator dir_iter(sourceDir); dir_iter != end_iter; ++dir_iter)
{
if (fs::is_regular_file(dir_iter->status()))
{
auto destFilePath = dest / dir_iter->path().filename();
copy_file(dir_iter->path(), destFilePath, fs::copy_option::overwrite_if_exists);
}
else if (fs::is_directory(dir_iter->status()))
{
auto currentPath = dir_iter->path();
auto pathAtDest = dest / currentPath.filename();
if (!fs::exists(pathAtDest))
{
// This just creates the directory
copy_directory(currentPath, pathAtDest);
}
mergeDirectories(currentPath, pathAtDest);
} // Ignore other kind of files for now
}
}
}
void
updateIfNeeded()
{
fs::path updatePath(fs::current_path() / fs::path(UPDATES_DIR));
if (fs::exists(updatePath))
{
std::cout << "Found updates, merging directories before doing anything..."
<< std::endl;
mergeDirectories(updatePath, fs::current_path());
fs::remove_all(updatePath);
}
else
{
std::cout << "No updates found" << std::endl;
}
}
int
main(int argc, char** argv)
{
try {
fs::path full_path(fs::current_path());
updateIfNeeded();
Py_Initialize();
Py_SetPythonHome(const_cast<char*>(full_path.string().c_str()));
py::object main_module = py::import("__main__");
py::object global = (main_module.attr("__dict__"));
PySys_SetArgv(argc, argv);
global["_pwd"] = full_path.string();
py::exec(
"import sys\n"
"sys.path = [_pwd + '/lib',\n"
" _pwd + '/apps',\n"
" _pwd + '/apps/eip',\n"
" _pwd]\n"
"import os\n"
"import encodings.idna\n" // we need to make sure this is imported
"sys.argv.append('--standalone')\n", global, global);
py::exec_file("apps/launcher.py",
global,
global);
} catch (py::error_already_set&) {
PyErr_PrintEx(0);
return 1;
}
return 0;
}
|