00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <sys/types.h>
00015 #include <sys/stat.h>
00016 #include <qsettings.h>
00017 #include <qdir.h>
00018 #include <qfile.h>
00019 #include "common.h"
00020
00021
00022 const QString QGit::GIT_VERSION = "1.4.4";
00023
00024
00025 const QColor QGit::BROWN = QColor(150, 75, 0);
00026 const QColor QGit::ORANGE = QColor(255, 160, 50);
00027 const QColor QGit::DARK_ORANGE = QColor(216, 144, 0);
00028 const QColor QGit::LIGHT_ORANGE = QColor(255, 221, 170);
00029 const QColor QGit::LIGHT_BLUE = QColor(85, 255, 255);
00030 const QColor QGit::PURPLE = QColor(221, 221, 255);
00031 const QColor QGit::DARK_GREEN = QColor(0, 205, 0);
00032
00033
00034 QColor QGit::ODD_LINE_COL;
00035 QColor QGit::EVEN_LINE_COL;
00036
00037
00038
00039
00040
00041
00042 QFont QGit::TYPE_WRITER_FONT("Helvetica");
00043
00044
00045 const QString QGit::PATCHES_DIR = "/.qgit_patches_copy";
00046 const QString QGit::PATCHES_NAME = "qgit_import";
00047
00048
00049 const QString QGit::ZERO_SHA = "0000000000000000000000000000000000000000";
00050 const QString QGit::CUSTOM_SHA = "CUSTOM";
00051 const QString QGit::ALL_MERGE_FILES = "ALL_MERGE_FILES";
00052
00053
00054 const QString QGit::APP_KEY = "/qgit/";
00055 const QString QGit::FP_DIR_KEY = "format_patch_last_dir";
00056 const QString QGit::FPATCH_ARGS_KEY = "format_patch_args";
00057 const QString QGit::FLAGS_KEY = "patch_flags";
00058 const QString QGit::CMT_GEOM_KEY = "commit_viewer_geometry";
00059 const QString QGit::CMT_SPLIT_KEY = "commit_viewer_splitter_sizes";
00060 const QString QGit::CMT_TEMPL_KEY = "commit_template_file_path";
00061 const QString QGit::CMT_ARGS_KEY = "commit_args";
00062 const QString QGit::EX_KEY = "exclude_file_path";
00063 const QString QGit::EX_PER_DIR_KEY = "exclude_per_directory_file_name";
00064 const QString QGit::EXT_DIFF_KEY = "external_diff_viewer";
00065 const QString QGit::REC_REP_KEY = "recent_open_repos";
00066 const QString QGit::MCR_NAME_KEY = "macro_name";
00067 const QString QGit::MCR_TEXT_KEY = "commands";
00068 const QString QGit::MCR_LIST_KEY = "macro_list";
00069 const QString QGit::FONT_KEY = "typewriter_font";
00070
00071
00072 const QString QGit::CMT_GEOM_DEF = "290,140,495,540";
00073 const QString QGit::CMT_SPLIT_DEF = "155,342";
00074 const QString QGit::CMT_TEMPL_DEF = ".git/commit-template";
00075 const QString QGit::EX_DEF = ".git/info/exclude";
00076 const QString QGit::EX_PER_DIR_DEF = ".gitignore";
00077 const QString QGit::EXT_DIFF_DEF = "kompare";
00078 const QString QGit::MCR_NAME_DEF = "New macro";
00079
00080
00081 const QString QGit::BAK_EXT = ".bak";
00082 const QString QGit::C_DAT_FILE = "/qgit_cache.dat";
00083
00084
00085 const QString QGit::QUOTE_CHAR = "$";
00086
00087 using namespace QGit;
00088
00089
00090 uint QGit::flags(SCRef group) {
00091
00092 QSettings settings;
00093 return settings.readNumEntry(APP_KEY + group + FLAGS_KEY, FLAGS_DEF);
00094 }
00095
00096 bool QGit::testFlag(uint f, SCRef group) {
00097
00098 return (flags(group) & f);
00099 }
00100
00101 void QGit::setFlag(uint f, bool b, SCRef group) {
00102
00103 QSettings settings;
00104 int flags = settings.readNumEntry(APP_KEY + group + FLAGS_KEY, FLAGS_DEF);
00105 flags = (b) ? flags | f : flags & ~f;
00106 settings.writeEntry(APP_KEY + group + FLAGS_KEY, flags);
00107 }
00108
00109 void QGit::writeSetting(SCRef key, SCRef value, SCRef group) {
00110
00111 QSettings settings;
00112 settings.writeEntry(APP_KEY + group + key, value);
00113 }
00114
00115
00116 bool QGit::stripPartialParaghraps(const QByteArray& ba, QString* dst, QString* prev) {
00117
00118 QString src(ba);
00119
00120 while (src.length() < ba.size() && ba.at(src.length()) == '\0') {
00121 int start = src.length() + 1;
00122 QByteArray tail;
00123 tail.duplicate(ba.data() + start, ba.size() - start);
00124 src.append(" ").append(tail);
00125 }
00126 int idx = src.findRev('\n');
00127 if (idx == -1) {
00128 prev->append(src);
00129 *dst = "";
00130 return false;
00131 }
00132 *dst = src.left(idx).prepend(*prev);
00133 *prev = src.mid(idx + 1);
00134 return true;
00135 }
00136
00137 bool QGit::writeToFile(SCRef fileName, SCRef data, bool setExecutable) {
00138
00139 QFile file(fileName);
00140 if (!file.open(IO_WriteOnly)) {
00141 dbp("ERROR: unable to write file %1", fileName);
00142 return false;
00143 }
00144 QTextStream stream(&file);
00145 stream << data;
00146 file.close();
00147 if (setExecutable) {
00148 if (chmod(fileName, 0755)) {
00149 dbp("ERROR: unable to set executable bit to file %1", fileName);
00150 QDir d;
00151 d.remove(fileName);
00152 return false;
00153 }
00154 }
00155 return true;
00156 }
00157
00158 bool QGit::writeToFile(SCRef fileName, const QByteArray& data, bool setExecutable) {
00159
00160 QFile file(fileName);
00161 if (!file.open(IO_WriteOnly)) {
00162 dbp("ERROR: unable to write file %1", fileName);
00163 return false;
00164 }
00165 QDataStream stream(&file);
00166 stream.writeRawBytes(data.data(), data.size());
00167 file.close();
00168 if (setExecutable)
00169 chmod(fileName, 0755);
00170 return true;
00171 }
00172
00173 bool QGit::readFromFile(SCRef fileName, QString& data) {
00174
00175 data = "";
00176 QFile file(fileName);
00177 if (!file.open(IO_ReadOnly)) {
00178 dbp("ERROR: unable to read file %1", fileName);
00179 return false;
00180 }
00181 QTextStream stream(&file);
00182 data = stream.read();
00183 file.close();
00184 return true;
00185 }
00186
00187 void QGit::baAppend(QByteArray** baPtr, const char* ascii, int len) {
00188
00189 QByteArray* ba = *baPtr;
00190 uint oldSize = 0;
00191 if (ba) {
00192 oldSize = ba->size();
00193 ba->resize(oldSize + len, QGArray::SpeedOptim);
00194 } else {
00195 ba = new QByteArray(len);
00196 *baPtr = ba;
00197 }
00198
00199 memcpy(ba->data() + oldSize, ascii, len);
00200 }
00201
00202 void QGit::baAppend(QByteArray& ba, const QByteArray& src) {
00203
00204 QByteArray* baPtr = &ba;
00205 baAppend(&baPtr, src.data(), src.size());
00206 }