BaseLog* BazaarLog::generateLog(const std::string& dir) { //does directory have a .bzr ? std::string bzrdir = dir + std::string("/.bzr"); struct stat dirinfo; int stat_rc = stat(bzrdir.c_str(), &dirinfo); if(stat_rc!=0 || !(dirinfo.st_mode & S_IFDIR)) { return 0; } std::string command = getLogCommand(); // do we have this client installed requireExecutable("bzr"); createTempLog(); if(temp_file.size()==0) return 0; char cmd_buff[2048]; sprintf(cmd_buff, "%s %s > %s", command.c_str(), dir.c_str(), temp_file.c_str()); int command_rc = systemCommand(cmd_buff); if(command_rc != 0) { return 0; } BaseLog* seeklog = new SeekLog(temp_file); return seeklog; }
BaseLog* MercurialLog::generateLog(std::string dir) { //does directory have a .git ? std::string hgdir = dir + std::string("/.hg"); struct stat dirinfo; int stat_rc = stat(hgdir.c_str(), &dirinfo); if(stat_rc!=0 || !(dirinfo.st_mode & S_IFDIR)) { return 0; } std::string command = getLogCommand(); createTempLog(); if(temp_file.size()==0) return 0; char cmd_buff[2048]; sprintf(cmd_buff, "%s -R %s > %s", command.c_str(), dir.c_str(), temp_file.c_str()); int command_rc = system(cmd_buff); if(command_rc != 0) { return 0; } BaseLog* seeklog = new SeekLog(temp_file); return seeklog; }
BaseLog* SVNCommitLog::generateLog(const std::string& dir) { //get working directory char cwd_buff[1024]; if(getcwd(cwd_buff, 1024) != cwd_buff) { return 0; } //does directory have a .svn ? std::string gitdir = dir + std::string("/.svn"); struct stat dirinfo; int stat_rc = stat(gitdir.c_str(), &dirinfo); if(stat_rc!=0 || !(dirinfo.st_mode & S_IFDIR)) { return 0; } // do we have this client installed requireExecutable("svn"); std::string command = getLogCommand(); //create temp file createTempLog(); if(temp_file.size()==0) return 0; if(chdir(dir.c_str()) != 0) { return 0; } char cmd_buff[2048]; snprintf(cmd_buff, 2048, "%s > %s", command.c_str(), temp_file.c_str()); int command_rc = systemCommand(cmd_buff); chdir(cwd_buff); if(command_rc != 0) { return 0; } BaseLog* seeklog = new SeekLog(temp_file); return seeklog; }
BaseLog* GitCommitLog::generateLog(const std::string& dir) { //get working directory char cwd_buff[1024]; if(getcwd(cwd_buff, 1024) != cwd_buff) { return 0; } //does directory have a .git ? std::string gitdir = dir + std::string("/.git"); struct stat dirinfo; int stat_rc = stat(gitdir.c_str(), &dirinfo); if(stat_rc!=0 || !(dirinfo.st_mode & S_IFDIR)) { return 0; } std::string command = getLogCommand(); //create temp file createTempLog(); if(temp_file.size()==0) return 0; if(chdir(dir.c_str()) != 0) { return 0; } char cmd_buff[2048]; sprintf(cmd_buff, "%s > %s", command.c_str(), temp_file.c_str()); int command_rc = system(cmd_buff); if(command_rc != 0) { chdir(cwd_buff); return 0; } // check for new-enough Git version // if %aN does not appear to be supported try %an std::ifstream in(temp_file.c_str()); char firstBytes[9]; in.read(firstBytes, 8); in.close(); firstBytes[8] = '\0'; if(!strcmp(firstBytes, "user:%aN")) { char *pos = strstr(cmd_buff, "%aN"); pos[2] = 'n'; command_rc = system(cmd_buff); } //change back to original directoy chdir(cwd_buff); if(command_rc != 0) { return 0; } BaseLog* seeklog = new SeekLog(temp_file); return seeklog; }
BaseLog* GitCommitLog::generateLog(std::string dir) { //get working directory char cwd_buff[1024]; if(getcwd(cwd_buff, 1024) != cwd_buff) { return 0; } //does directory have a .git ? std::string gitdir = dir + std::string("/.git"); struct stat dirinfo; int stat_rc = stat(gitdir.c_str(), &dirinfo); if(stat_rc!=0 || !(dirinfo.st_mode & S_IFDIR)) { return 0; } std::string command = getLogCommand(); //create temp file char cmd_buff[2048]; char logfile_buff[1024]; #ifdef _WIN32 DWORD tmplen = GetTempPath(0, L""); if(tmplen == 0) return 0; std::vector<TCHAR> temp(tmplen+1); tmplen = GetTempPath(static_cast<DWORD>(temp.size()), &temp[0]); if(tmplen == 0 || tmplen >= temp.size()) return 0; std::string temp_file_path(temp.begin(), temp.begin() + static_cast<std::size_t>(tmplen)); temp_file_path += "gource.tmp"; sprintf(logfile_buff, "%s", temp_file_path.c_str()); #else uid_t myuid = getuid(); sprintf(logfile_buff, "/tmp/gource-%d.tmp", myuid); #endif sprintf(cmd_buff, "%s > %s", command.c_str(), logfile_buff); temp_file = std::string(logfile_buff); if(chdir(dir.c_str()) != 0) { return 0; } int command_rc = system(cmd_buff); if(command_rc != 0) { return 0; } // check for new-enough Git version // if %aN does not appear to be supported try %an std::ifstream in(logfile_buff); char firstBytes[9]; in.read(firstBytes, 8); in.close(); firstBytes[8] = '\0'; if(!strcmp(firstBytes, "user:%aN")) { char *pos = strstr(cmd_buff, "%aN"); pos[2] = 'n'; command_rc = system(cmd_buff); } //change back to original directoy chdir(cwd_buff); if(command_rc != 0) { return 0; } BaseLog* seeklog = new SeekLog(temp_file); return seeklog; }