SVN commit 943002 by wiesel: DVCS: Escape filenames beginning with a hyphen M +20 -12 git/gitplugin.cpp M +1 -1 mercurial/CMakeLists.txt M +32 -78 mercurial/mercurialplugin.cpp --- trunk/KDE/kdevplatform/plugins/git/gitplugin.cpp #943001:943002 @@ -84,19 +84,18 @@ bool GitPlugin::isVersionControlled(const KUrl &path) { - QString workDir = path.path(); - QString filename; - QFileInfo fsObject(workDir); - if (fsObject.isFile()) - { - workDir = fsObject.path(); - filename = fsObject.fileName(); + QFileInfo fsObject(path.path()); + if (!fsObject.isFile()) { + return isValidDirectory(path); } - else - return isValidDirectory(path); - QStringList otherFiles = getLsFiles(workDir); - return otherFiles.contains(filename); + QString workDir = fsObject.path(); + QString filename = fsObject.fileName(); + + QStringList listfiles("--"); + listfiles.append(filename); + QStringList otherFiles = getLsFiles(workDir, listfiles); + return !otherFiles.empty(); } VcsJob* GitPlugin::init(const KUrl &directory) @@ -117,6 +116,7 @@ if (prepareJob(job, localRepositoryRoot.toLocalFile(), GitPlugin::Init) ) { *job << "git"; *job << "clone"; + *job << "--"; *job << localOrRepoLocationSrc.localUrl().pathOrUrl(); return job; } @@ -134,6 +134,7 @@ if (prepareJob(job, localLocations.front().path()) ) { *job << "git"; *job << "add"; + *job << "--"; addFileList(job, localLocations); return job; @@ -167,7 +168,7 @@ { Q_UNUSED(recursion) - if (localLocations.empty()) + if (localLocations.empty() || message.isEmpty()) return NULL; DVcsJob* job = new DVcsJob(this); @@ -177,6 +178,8 @@ *job << "-m"; //Note: the message is quoted somewhere else, so if we quote here then we have quotes in the commit log *job << message; + *job << "--"; + addFileList(job, localLocations); return job; } if (job) delete job; @@ -192,6 +195,7 @@ if (prepareJob(job, files.front().path()) ) { *job << "git"; *job << "rm"; + *job << "--"; addFileList(job, files); return job; } @@ -210,6 +214,7 @@ if (prepareJob(job, localLocation.path()) ) { *job << "git"; *job << "log"; + *job << "--"; addFileList(job, localLocation); return job; } @@ -246,6 +251,7 @@ if (prepareJob(job, repository) ) { *job << "git"; *job << "checkout"; + *job << "--"; *job << branch; return job; } @@ -263,6 +269,7 @@ //Empty branch has 'something' so it breaks the command if (!args.isEmpty()) *job << args; + *job << "--"; if (!branch.isEmpty()) *job << branch; if (!basebranch.isEmpty()) @@ -285,6 +292,7 @@ //Empty branch has 'something' so it breaks the command if (!args.isEmpty()) *job << args; + *job << "--"; addFileList(job, files); return job; } --- trunk/KDE/kdevplatform/plugins/mercurial/CMakeLists.txt #943001:943002 @@ -1,4 +1,4 @@ -add_definitions(-DKDE_DEFAULT_DEBUG_AREA=9525) +add_definitions(-DKDE_DEFAULT_DEBUG_AREA=9526) add_subdirectory(tests) ########### next target ############### --- trunk/KDE/kdevplatform/plugins/mercurial/mercurialplugin.cpp #943001:943002 @@ -75,6 +75,7 @@ bool MercurialPlugin::isValidDirectory(const KUrl & directory) { + // Mercurial uses the same test, so we don't lose any functionality static const QString hgDir(".hg"); const QString initialPath(directory.toLocalFile()); const QFileInfo finfo(initialPath); @@ -88,7 +89,7 @@ while (!dir.cd(hgDir) && dir.cdUp()) {} // cdUp, until there is a sub-directory called .hg - return hgDir == dir.dirName(); // Mercurial uses the same test, so we don't lose any functionality + return hgDir == dir.dirName(); } bool MercurialPlugin::isVersionControlled(const KUrl & url) @@ -99,12 +100,14 @@ return isValidDirectory(url); } - // Clean, Added, Modified, Only current and subdirectories - static const QStringList versionControlledFlags(QString("-c -a -m .").split(' ')); + // Clean, Added, Modified. Escape possible files starting with "-" + static const QStringList versionControlledFlags(QString("-c -a -m --").split(' ')); const QString absolutePath = fsObject.absolutePath(); - const QStringList filesInDir = getLsFiles(absolutePath, versionControlledFlags); + QStringList listFile(versionControlledFlags); + listFile.push_back(fsObject.fileName()); + const QStringList filesInDir = getLsFiles(absolutePath, listFile); - return filesInDir.contains(fsObject.absoluteFilePath()); + return !filesInDir.empty(); } VcsJob* MercurialPlugin::init(const KUrl &directory) @@ -128,7 +131,7 @@ return NULL; } - *job << "hg" << "clone" << localOrRepoLocationSrc.localUrl().pathOrUrl(); + *job << "hg" << "clone" << "--" << localOrRepoLocationSrc.localUrl().pathOrUrl(); return job.release(); } @@ -141,7 +144,7 @@ return NULL; } - *job << "hg" << "fetch"; + *job << "hg" << "fetch" << "--"; QString pathOrUrl = otherRepository.localUrl().pathOrUrl(); @@ -159,7 +162,7 @@ return NULL; } - *job << "hg" << "push"; + *job << "hg" << "push" << "--"; QString pathOrUrl = otherRepository.localUrl().pathOrUrl(); @@ -180,7 +183,7 @@ return NULL; } - *job << "hg" << "add"; + *job << "hg" << "add" << "--"; if (!addDirsConditionally(job.get(), localLocations, recursion)) { return NULL; @@ -197,7 +200,7 @@ return NULL; } - *job << "hg" << "cp" << localLocationSrc.path() << localLocationDst.path(); + *job << "hg" << "cp" << "--" << localLocationSrc.path() << localLocationDst.path(); return job.release(); } @@ -211,7 +214,7 @@ return NULL; } - *job << "hg" << "mv" << localLocationSrc.path() << localLocationDst.path(); + *job << "hg" << "mv" << "--" << localLocationSrc.path() << localLocationDst.path(); return job.release(); } @@ -231,7 +234,7 @@ } //Note: the message is quoted somewhere else, so if we quote here then we have quotes in the commit log - *job << "hg" << "commit" << "-m" << message; + *job << "hg" << "commit" << "-m" << message << "--"; if (!addDirsConditionally(job.get(), localLocations, recursion)) { return NULL; @@ -281,6 +284,7 @@ // *job << "-r" << srcRev; // if ("" != dstRev) // *job << "-r" << dstRev; + *job << "--"; *job << srcPath; connect(job.get(), SIGNAL(readyForParsing(DVcsJob*)), SLOT(parseDiff(DVcsJob*))); @@ -299,7 +303,7 @@ return NULL; } - *job << "hg" << "rm"; + *job << "hg" << "rm" << "--"; addFileList(job.get(), files); return job.release(); @@ -313,7 +317,7 @@ return NULL; } - *job << "hg" << "status"; + *job << "hg" << "status" << "-A" << "--"; if (!addDirsConditionally(job.get(), localLocations, recursion)) { return NULL; } @@ -325,18 +329,21 @@ bool MercurialPlugin::parseStatus(DVcsJob *job) const { - if (job->status() != VcsJob::JobSucceeded) + if (job->status() != VcsJob::JobSucceeded) { + kDebug() << job->output(); return false; + } const QString dir = job->getDirectory().absolutePath().append(QDir::separator()); const QStringList output = job->output().split('\n', QString::SkipEmptyParts); QList filestatus; - foreach(const QString &line, output) { QChar stCh = line.at(0); KUrl file(line.mid(2).prepend(dir)); + kDebug() << dir; + VcsStatusInfo status; status.setUrl(file); status.setState(charToState(stCh.toAscii())); @@ -360,7 +367,7 @@ return NULL; } - *job << "hg" << "revert"; + *job << "hg" << "revert" << "--"; if (!addDirsConditionally(job.get(), localLocations, recursion)) { return NULL; } @@ -380,7 +387,7 @@ return NULL; } - *job << "hg" << "log" << "--template" << "{file_copies}\\0{file_dels}\\0{file_adds}\\0{file_mods}\\0{desc}\\0{date|isodate}\\0{author}\\0{parents}\\0{node}\\0{rev}\\0"; + *job << "hg" << "log" << "--template" << "{file_copies}\\0{file_dels}\\0{file_adds}\\0{file_mods}\\0{desc}\\0{date|isodate}\\0{author}\\0{parents}\\0{node}\\0{rev}\\0" << "--"; addFileList(job.get(), localLocation); connect(job.get(), SIGNAL(readyForParsing(DVcsJob*)), SLOT(parseLogOutputBasicVersionControl(DVcsJob*))); @@ -413,6 +420,8 @@ if (srev != QString::null && !srev.isEmpty()) *job << "-r" << srev; + *job << "--"; + *job << localLocation.path(); connect(job.get(), SIGNAL(readyForParsing(DVcsJob*)), SLOT(parseAnnotations(DVcsJob*))); @@ -428,7 +437,7 @@ return NULL; } - *job << "hg" << "update" << branch; + *job << "hg" << "update" << "--" << branch; return job.release(); } @@ -453,7 +462,7 @@ return NULL; } - *job << "hg" << "branch" << branch; + *job << "hg" << "branch" << "--" << branch; return job.release(); } @@ -471,9 +480,10 @@ if (!args.isEmpty()) *job << args; - if (!files.isEmpty()) + if (!files.isEmpty()) { + *job << "--"; addFileList(job.get(), files); - else + } else *job << "-a"; return job.release(); @@ -510,65 +520,9 @@ return job->output().split('\n', QString::SkipEmptyParts); } -#if 0 -QList MercurialPlugin::getOtherFiles(const QString & directory) -{ - QStringList args("-u"); // Unknown file - args.push_back("."); // Current and subdirectories - const QStringList otherFiles = getLsFiles(directory, args); - QList others; - foreach(const QString &file, otherFiles) { - VcsStatusInfo status; - status.setUrl(file); - status.setState(VcsStatusInfo::ItemUnknown); - others.append(qVariantFromValue(status)); - } - return others; -} - -QList MercurialPlugin::getModifiedFiles(const QString &directory) -{ - std::auto_ptr job(new DVcsJob(this)); - - if (!prepareJob(job.get(), directory)) { - return QList(); - } - *job << "hg" << "status" << "-m" << "-a" << "-r" << "-d" << "."; - - if (!job->exec() || job->status() != VcsJob::JobSucceeded) - return QList(); - - const QString dir = job->getDirectory().absolutePath().append(QDir::separator()); - const QStringList output = job.release()->output().split('\n', QString::SkipEmptyParts); - QList modifiedFiles; - - foreach(const QString &line, output) { - QChar stCh = line.at(0); - - KUrl file(line.mid(2).prepend(dir)); - - VcsStatusInfo status; - status.setUrl(file); - status.setState(charToState(stCh.toAscii())); - - modifiedFiles.append(qVariantFromValue(status)); - } - - return modifiedFiles; -} - -QList MercurialPlugin::getCachedFiles(const QString &directory) -{ - Q_UNUSED(directory) - QList cachedFiles; - return cachedFiles; -} -#endif - QList MercurialPlugin::getAllCommits(const QString &repo) { - qDebug("MercurialPlugin::getAllCommits(): %s", repo.toLocal8Bit().constData()); std::auto_ptr job(new DVcsJob(this)); job->setAutoDelete(false);