00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
#include <iostream>
00040
#include <sstream>
00041
#include <cstdlib>
00042
#include <dirent.h>
00043
#include <unistd.h>
00044
#include <sys/stat.h>
00045
00046
using namespace std;
00047
00048
bool isdir(
const string& path);
00049
bool islink(
const string& path);
00050
void makedir(
const string& dir);
00051
int goAndCreateDir(
string sourcedir,
string destdir,
string spc);
00052
void copyAndLinkObjs(
string& sourceOBJdir,
string& original_sourcedir,
string& destOBJdir);
00053
00054 int main(
int argc,
char *argv[])
00055 {
00056
00057
if (argc < 3)
00058 {
00059 cout <<
"odicop <sourcedir> <destdir>" << endl;
00060
return 0;
00061 }
00062
00063
string sourcedir = argv[1];
00064
string destdir = argv[2];
00065
00066
if (sourcedir[sourcedir.length()-1] !=
'/')
00067 sourcedir +=
'/';
00068
00069
if (destdir[destdir.length()-1] !=
'/')
00070 destdir +=
'/';
00071
00072
goAndCreateDir(sourcedir, destdir,
"");
00073
00074
return EXIT_SUCCESS;
00075 }
00076
00077
00078
00079 int goAndCreateDir(
string sourcedir,
string destdir,
string spc)
00080 {
00081
string newSourceDir;
00082
string newDestDir;
00083
string command;
00084 cout << spc <<
"Examining dir " << sourcedir << endl;
00085 spc +=
" ";
00086
00087 DIR* d = opendir(sourcedir.c_str());
00088
if(!d)
00089 {
00090 cerr <<
"Could not open directory " << sourcedir.c_str() << endl;
00091
return 1;
00092 }
00093
struct dirent* dent;
00094
00095
bool hasCode =
false;
00096
bool hasOBJS =
false;
00097
00098
while( (dent = readdir(d)) != 0)
00099 {
00100
00101
string s = dent->d_name;
00102
00103
if(s==
"." || s==
"..")
00104
continue;
00105
00106
if (s.find(
"OBJS") != string::npos)
00107 {
00108
if (
islink(sourcedir + s))
00109 {
00110 command =
"rm " + sourcedir + s;
00111 system(command.c_str());
00112 }
00113
else
00114 hasOBJS =
true;
00115 }
00116
00117
if (!
isdir(sourcedir + s))
00118 {
00119
if (s.rfind(
".cc") != string::npos)
00120 hasCode =
true;
00121
00122
continue;
00123 }
00124
00125
00126
if (s.find(
"CVS") != string::npos)
00127
continue;
00128
00129 newSourceDir = sourcedir + s +
"/";
00130 newDestDir = destdir + s +
"/";
00131
makedir(newDestDir);
00132
00133
if(s.find(
"OBJS") != string::npos)
00134 {
00135
00136 cout << spc <<
"-> Copying and creating link..";
00137 cout.flush();
00138
copyAndLinkObjs(newSourceDir, sourcedir, newDestDir);
00139 cout <<
"done!" << endl;
00140 }
00141
else
00142 {
00143
00144
goAndCreateDir(newSourceDir, newDestDir, spc);
00145 }
00146
00147 }
00148
00149
if (hasCode && !hasOBJS)
00150 {
00151 cout << spc <<
"-> Creating OBJS dir and linking it..";
00152
00153
00154
00155
if (!
isdir(destdir +
"OBJS"))
00156
makedir(destdir +
"OBJS");
00157
00158 command =
"ln -s " + destdir +
"OBJS " + sourcedir;
00159 system(command.c_str());
00160
00161 cout <<
"done!" << endl;
00162 }
00163
00164
00165 closedir(d);
00166
00167
return 0;
00168 }
00169
00170 void copyAndLinkObjs(
string& sourceOBJdir,
string& original_sourcedir,
string& destOBJdir)
00171 {
00172
string command;
00173
00174
00175 command =
"cp -R " + sourceOBJdir +
"*" +
" " + destOBJdir;
00176 system(command.c_str());
00177
00178
00179 command =
"rm -R " + sourceOBJdir;
00180 system(command.c_str());
00181
00182
00183 command =
"ln -s " + destOBJdir +
" " + original_sourcedir;
00184 system(command.c_str());
00185
00186 }
00187
00188
00189 void makedir(
const string& dir)
00190 {
00191
00192
if (
isdir(dir))
00193
return;
00194
00195
00196
string mkdirCommand =
"mkdir " + dir;
00197 system(mkdirCommand.c_str());
00198 }
00199
00200 bool isdir(
const string& path)
00201 {
00202
struct stat statusinfo;
00203
int status;
00204
00205 status = lstat(path.c_str(), &statusinfo);
00206
00207
if (status != 0)
00208
return false;
00209
00210
if (S_ISDIR(statusinfo.st_mode))
00211
return true;
00212
else
00213
return false;
00214 }
00215
00216 bool islink(
const string& path)
00217 {
00218
struct stat statusinfo;
00219
int status;
00220
00221 status = lstat(path.c_str(), &statusinfo);
00222
00223
if (status != 0)
00224
return false;
00225
00226
if (S_ISLNK(statusinfo.st_mode))
00227
return true;
00228
else
00229
return false;
00230
00231 }
00232