Mercurial > hg > easyhg
diff src/common.cpp @ 370:b9c153e00e84
Move source files to src/
author | Chris Cannam |
---|---|
date | Thu, 24 Mar 2011 10:27:51 +0000 |
parents | common.cpp@8fd71f570884 |
children | 005633eed862 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/common.cpp Thu Mar 24 10:27:51 2011 +0000 @@ -0,0 +1,259 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + EasyMercurial + + Based on HgExplorer by Jari Korhonen + Copyright (c) 2010 Jari Korhonen + Copyright (c) 2011 Chris Cannam + Copyright (c) 2011 Queen Mary, University of London + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "common.h" +#include "debug.h" + +#include <QFileInfo> +#include <QProcessEnvironment> +#include <QStringList> +#include <QDir> +#include <QRegExp> + +#include <sys/types.h> + +#ifdef Q_OS_WIN32 +#define _WIN32_WINNT 0x0500 +#define SECURITY_WIN32 +#include <windows.h> +#include <security.h> +#else +#include <errno.h> +#include <pwd.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <signal.h> +#endif + +QString findInPath(QString name, QString installPath, bool executableRequired) +{ + bool found = false; + if (name != "") { + if (name[0] != '/' +#ifdef Q_OS_WIN32 + && (QRegExp("^\\w:").indexIn(name) != 0) +#endif + ) { +#ifdef Q_OS_WIN32 + QChar pathSep = ';'; +#else + QChar pathSep = ':'; +#endif + name = QFileInfo(name).fileName(); + QString path = + QProcessEnvironment::systemEnvironment().value("PATH"); + DEBUG << "findInPath: seeking location for binary " << name + << ": system path is " << path << endl; + if (installPath != "") { + DEBUG << "findInPath: install path is " << installPath + << ", adding to system path" << endl; + //!!! path = path + pathSep + installPath; + path = installPath + pathSep + path; + } +#ifndef Q_OS_WIN32 + //!!! + path = path + ":/usr/local/bin"; + DEBUG << "... adding /usr/local/bin just in case (fix and add settings dlg please)" + << endl; +#endif + QStringList elements = path.split(pathSep, QString::SkipEmptyParts); + foreach (QString element, elements) { + QString full = QDir(element).filePath(name); + QFileInfo fi(full); + DEBUG << "findInPath: looking at " << full << endl; + if (fi.exists() && fi.isFile()) { + DEBUG << "findInPath: it's a file" << endl; + if (!executableRequired || fi.isExecutable()) { + name = full; + DEBUG << "findInPath: found at " << name << endl; + found = true; + break; + } + } + } + } else { + // absolute path given + QFileInfo fi(name); + DEBUG << "findInPath: looking at absolute path " << name << endl; + if (fi.exists() && fi.isFile()) { + DEBUG << "findInPath: it's a file" << endl; + if (!executableRequired || fi.isExecutable()) { + DEBUG << "findInPath: found at " << name << endl; + found = true; + } + } + } + } +#ifdef Q_OS_WIN32 + if (!found) { + if (!name.endsWith(".exe")) { + return findInPath(name + ".exe", installPath, executableRequired); + } + } +#endif + if (found) { + return name; + } else { + return ""; + } +} + +#ifdef Q_OS_WIN32 +QString getUserRealName() +{ + TCHAR buf[1024]; + long unsigned int maxlen = 1000; + LPTSTR info = buf; + + if (!GetUserNameEx(NameDisplay, info, &maxlen)) { + DEBUG << "GetUserNameEx failed: " << GetLastError() << endl; + return ""; + } + +#ifdef UNICODE + return QString::fromUtf16((const unsigned short *)info); +#else + return QString::fromLocal8Bit(info); +#endif +} +#else +#ifdef Q_OS_MAC +// Nothing here: definition is in common_osx.mm +#else +QString getUserRealName() +{ + const int maxlen = 1023; + char buf[maxlen + 2]; + + if (getlogin_r(buf, maxlen)) return ""; + + struct passwd *p = getpwnam(buf); + if (!p) return ""; + + QString s(p->pw_gecos); + if (s != "") s = s.split(',')[0]; + return s; +} +#endif +#endif + +void loseControllingTerminal() +{ +#ifndef Q_OS_WIN32 + + if (!isatty(0)) { + DEBUG << "stdin is not a terminal" << endl; + } else { + DEBUG << "stdin is a terminal, detaching from it" << endl; + if (ioctl(0, TIOCNOTTY, NULL) < 0) { + perror("ioctl failed"); + DEBUG << "ioctl for TIOCNOTTY on stdin failed (errno = " << errno << ")" << endl; + } else { + DEBUG << "ioctl for TIOCNOTTY on stdin succeeded" << endl; + return; + } + } + + int ttyfd = open("/dev/tty", O_RDWR); + if (ttyfd < 0) { + DEBUG << "failed to open controlling terminal" << endl; + } else { + if (ioctl(ttyfd, TIOCNOTTY, NULL) < 0) { + perror("ioctl failed"); + DEBUG << "ioctl for TIOCNOTTY on controlling terminal failed (errno = " << errno << ")" << endl; + } else { + DEBUG << "ioctl for TIOCNOTTY on controlling terminal succeeded" << endl; + return; + } + } + +#endif +} + +void installSignalHandlers() +{ +#ifndef Q_OS_WIN32 + sigset_t sgnals; + sigemptyset (&sgnals); + sigaddset(&sgnals, SIGHUP); + sigaddset(&sgnals, SIGCONT); + pthread_sigmask(SIG_BLOCK, &sgnals, 0); +#endif +} + +FolderStatus getFolderStatus(QString path) +{ + if (path != "/" && path.endsWith("/")) { + path = path.left(path.length()-1); + } + DEBUG << "getFolderStatus: " << path << endl; + QFileInfo fi(path); + if (fi.exists()) { + DEBUG << "exists" << endl; + QDir dir(path); + if (!dir.exists()) { // returns false for files + DEBUG << "not directory" << endl; + return FolderIsFile; + } + if (QDir(dir.filePath(".hg")).exists()) { + DEBUG << "has repo" << endl; + return FolderHasRepo; + } + return FolderExists; + } else { + QDir parent = fi.dir(); + if (parent.exists()) { + DEBUG << "parent exists" << endl; + return FolderParentExists; + } + return FolderUnknown; + } +} + +QString getContainingRepoFolder(QString path) +{ + if (getFolderStatus(path) == FolderHasRepo) return ""; + + QFileInfo me(path); + QFileInfo parent(me.dir().absolutePath()); + + while (me != parent) { + QString parentPath = parent.filePath(); + if (getFolderStatus(parentPath) == FolderHasRepo) { + return parentPath; + } + me = parent; + parent = me.dir().absolutePath(); + } + + return ""; +} + +QString xmlEncode(QString s) +{ + s + .replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\"", """) + .replace("'", "'"); + + return s; +}