bool HistoryView::filterRightButtonPressed(QMouseEvent* e) { QModelIndex index = indexAt(e->pos()); SCRef selSha = sha(index.row()); if (selSha.isEmpty()) return false; if (e->modifiers() == Qt::ControlModifier) { // check for 'diff to' function if (selSha != ZERO_SHA && st->sha() != ZERO_SHA) { if (selSha != st->diffToSha()) st->setDiffToSha(selSha); else st->setDiffToSha(""); // restore std view filterNextContextMenuRequest = true; UPDATE_DOMAIN(d); return true; // filter event out } } // check for 'children & parents' function, i.e. if mouse is on the graph if (index.column() == GRAPH_COL) { filterNextContextMenuRequest = true; QStringList parents, children; if (getLaneParentsChilds(selSha, e->pos().x(), parents, children)) emit lanesContextMenuRequested(parents, children); return true; // filter event out } return false; }
bool Annotate::getNextSection(SCRef d, int& idx, QString& sec, SCRef target) { if (idx >= d.length()) return false; int newIdx = d.indexOf(target, idx); if (newIdx == -1) // last section, take all newIdx = d.length() - 1; sec = d.mid(idx, newIdx - idx + 1); idx = newIdx + 1; return true; }
const QStringList MyProcess::splitArgList(SCRef cmd) { // return argument list handling quotes and double quotes // substring, as example from: // cmd some_arg "some thing" v='some value' // to (comma separated fields) // sl = <cmd,some_arg,some thing,v='some value'> // early exit the common case if (!( cmd.contains(QGit::QUOTE_CHAR) || cmd.contains("\"") || cmd.contains("\'"))) return cmd.split(' ', QString::SkipEmptyParts); // we have some work to do... // first find a possible separator const QString sepList("#%&!?"); // separator candidates int i = 0; while (cmd.contains(sepList[i]) && i < sepList.length()) i++; if (i == sepList.length()) { dbs("ASSERT no unique separator found."); return QStringList(); } const QChar& sepChar(sepList[i]); // remove all spaces QString newCmd(cmd); newCmd.replace(QChar(' '), sepChar); // re-add spaces in quoted sections restoreSpaces(newCmd, sepChar); // QUOTE_CHAR is used internally to delimit arguments // with quoted text wholly inside as // arg1 = <[patch] cool patch on "cool feature"> // and should be removed before to feed QProcess newCmd.remove(QGit::QUOTE_CHAR); // QProcess::setArguments doesn't want quote // delimited arguments, so remove trailing quotes QStringList sl(newCmd.split(sepChar, QString::SkipEmptyParts)); QStringList::iterator it(sl.begin()); for ( ; it != sl.end(); ++it) { if (((*it).left(1) == "\"" && (*it).right(1) == "\"") || ((*it).left(1) == "\'" && (*it).right(1) == "\'")) *it = (*it).mid(1, (*it).length() - 2); } return sl; }
int Git::findFileIndex(const RevFile& rf, SCRef name) { if (name.isEmpty()) return -1; int idx = name.lastIndexOf('/') + 1; SCRef dr = name.left(idx); SCRef nm = name.mid(idx); for (uint i = 0, cnt = rf.count(); i < cnt; ++i) { if (fileNamesVec[rf.nameAt(i)] == nm && dirNamesVec[rf.dirAt(i)] == dr) return i; } return -1; }
bool Git::isBinaryFile(SCRef file) { static const char* binaryFileExtensions[] = {"bmp", "gif", "jpeg", "jpg", "png", "svg", "tiff", "pcx", "xcf", "xpm", "bz", "bz2", "rar", "tar", "z", "gz", "tgz", "zip", 0}; if (isImageFile(file)) return true; const QString ext(file.section('.', -1).toLower()); int i = 0; while (binaryFileExtensions[i] != 0) if (ext == binaryFileExtensions[i++]) return true; return false; }
const QString Git::getWorkDirDiff(SCRef fileName) { QString runCmd("git diff-index --no-color -r -z -m -p --full-index --no-commit-id HEAD"), runOutput; if (!fileName.isEmpty()) runCmd.append(" -- " + quote(fileName)); if (!run(runCmd, &runOutput)) return ""; /* For unknown reasons file sha of index is not ZERO_SHA but a value of unknown origin. Replace that with ZERO_SHA so to not fool annotate */ int idx = runOutput.indexOf(".."); if (idx != -1) runOutput.replace(idx + 2, 40, ZERO_SHA); return runOutput; }
const QString Annotate::setupAuthor(SCRef origAuthor, int annId) { QString tmp(origAuthor.section('<', 0, 0).trimmed()); // strip e-mail address if (tmp.isEmpty()) { // probably only e-mail tmp = origAuthor; tmp.remove('<').remove('>'); tmp = tmp.trimmed(); tmp.truncate(MAX_AUTHOR_LEN); } // shrink author name if necessary if (tmp.length() > MAX_AUTHOR_LEN) { SCRef firstName(tmp.section(' ', 0, 0).trimmed()); SCRef surname(tmp.section(' ', 1).trimmed()); if (!firstName.isEmpty() && !surname.isEmpty()) tmp = firstName.left(1) + ". " + surname; tmp.truncate(MAX_AUTHOR_LEN); } return QString("%1.%2").arg(annId, annNumLen).arg(tmp); }
const QString Git::getRevInfo(SCRef sha) { if (sha.isEmpty()) return ""; uint type = checkRef(sha); if (type == 0) return ""; QString refsInfo; if (type & BRANCH) { const QString cap(type & CUR_BRANCH ? "HEAD: " : "Branch: "); refsInfo = cap + getRefName(sha, BRANCH).join(" "); } if (type & RMT_BRANCH) refsInfo.append(" Remote branch: " + getRefName(sha, RMT_BRANCH).join(" ")); if (type & TAG) refsInfo.append(" Tag: " + getRefName(sha, TAG).join(" ")); if (type & REF) refsInfo.append(" Ref: " + getRefName(sha, REF).join(" ")); if (type & APPLIED) refsInfo.append(" Patch: " + getRefName(sha, APPLIED).join(" ")); if (type & UN_APPLIED) refsInfo.append(" Patch: " + getRefName(sha, UN_APPLIED).join(" ")); if (type & TAG) { SCRef msg(getTagMsg(sha)); if (!msg.isEmpty()) refsInfo.append(" [" + msg + "]"); } return refsInfo.trimmed(); }
bool Git::isImageFile(SCRef file) { const QString ext(file.section('.', -1).toLower()); return QImageReader::supportedImageFormats().contains(ext.toLatin1()); }