Skip to content

Commit

Permalink
ファイルdiffの比較対象が uncommit changes のとき、ファイルの内容が表示されなくなっていたのを修正
Browse files Browse the repository at this point in the history
  • Loading branch information
soramimi committed Jul 18, 2023
1 parent ca29f3c commit dcd4bdb
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 44 deletions.
4 changes: 2 additions & 2 deletions src/BigDiffWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ void BigDiffWindow::init(MainWindow *mw, FileDiffWidget::InitParam_ const &param
}
return id;
};
ui->lineEdit_left->setText(Text(m->param.diff.blob.a_id));
ui->lineEdit_right->setText(Text(m->param.diff.blob.b_id));
ui->lineEdit_left->setText(Text(m->param.diff.blob.a_id_or_path));
ui->lineEdit_right->setText(Text(m->param.diff.blob.b_id_or_path));

switch (m->param.view_style) {
case FileDiffWidget::ViewStyle::LeftOnly:
Expand Down
42 changes: 21 additions & 21 deletions src/FileDiffWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -401,8 +401,8 @@ void FileDiffWidget::setDiffText(Git::Diff const &diff, TextDiffLineList const &
}
}

ui->widget_diff_left->setText(&m->left_lines, mainwindow(), diff.blob.a_id, diff.path);
ui->widget_diff_right->setText(&m->right_lines, mainwindow(), diff.blob.b_id, diff.path);
ui->widget_diff_left->setText(&m->left_lines, mainwindow(), diff.blob.a_id_or_path, diff.path);
ui->widget_diff_right->setText(&m->right_lines, mainwindow(), diff.blob.b_id_or_path, diff.path);
refrectScrollBar(true);
ui->widget_diff_slider->clear(true);
}
Expand All @@ -424,9 +424,9 @@ FileViewType FileDiffWidget::setupPreviewWidget()
ui->horizontalScrollBar->setVisible(false);
ui->widget_diff_slider->setVisible(false);

qDebug() << mimetype_l << m->init_param_.diff.blob.a_id << mimetype_r << m->init_param_.diff.blob.b_id;
ui->widget_diff_left->setImage(mimetype_l, m->init_param_.bytes_a, m->init_param_.diff.blob.a_id, m->init_param_.diff.path);
ui->widget_diff_right->setImage(mimetype_r, m->init_param_.bytes_b, m->init_param_.diff.blob.b_id, m->init_param_.diff.path);
// qDebug() << mimetype_l << m->init_param_.diff.blob.a_id_or_path << mimetype_r << m->init_param_.diff.blob.b_id_or_path;
ui->widget_diff_left->setImage(mimetype_l, m->init_param_.bytes_a, m->init_param_.diff.blob.a_id_or_path, m->init_param_.diff.path);
ui->widget_diff_right->setImage(mimetype_r, m->init_param_.bytes_b, m->init_param_.diff.blob.b_id_or_path, m->init_param_.diff.path);

return FileViewType::Image;

Expand All @@ -447,7 +447,7 @@ void FileDiffWidget::setSingleFile(QByteArray const &ba, QString const &id, QStr
m->init_param_.view_style = FileDiffWidget::ViewStyle::SingleFile;
m->init_param_.bytes_a = ba;
m->init_param_.diff.path = path;
m->init_param_.diff.blob.a_id = id;
m->init_param_.diff.blob.a_id_or_path = id;
}

void FileDiffWidget::setOriginalLines_(QByteArray const &ba, Git::SubmoduleItem const *submodule, Git::CommitItem const *submodule_commit)
Expand Down Expand Up @@ -651,9 +651,9 @@ void FileDiffWidget::updateDiffView(Git::Diff const &info, bool uncommited)
if (!g) return;
if (!g->isValidWorkingCopy()) return;

if (isValidID_(info.blob.a_id) && isValidID_(info.blob.b_id)) {
Git::Object obj_a = cat_file(g, info.blob.a_id);
Git::Object obj_b = cat_file(g, info.blob.b_id);
if (isValidID_(info.blob.a_id_or_path) && isValidID_(info.blob.b_id_or_path)) {
Git::Object obj_a = cat_file(g, info.blob.a_id_or_path);
Git::Object obj_b = cat_file(g, info.blob.b_id_or_path);
QString mime_a = mainwindow()->determinFileType(obj_a.content);
QString mime_b = mainwindow()->determinFileType(obj_b.content);
if (misc::isImage(mime_a) && misc::isImage(mime_b)) {
Expand All @@ -664,23 +664,23 @@ void FileDiffWidget::updateDiffView(Git::Diff const &info, bool uncommited)

{
Git::Diff diff;
if (isValidID_(info.blob.a_id) && isValidID_(info.blob.b_id)) {
std::string text = diffObjects(g, info.blob.a_id, info.blob.b_id).toStdString();
if (isValidID_(info.blob.a_id_or_path) && isValidID_(info.blob.b_id_or_path)) {
std::string text = diffObjects(g, info.blob.a_id_or_path, info.blob.b_id_or_path).toStdString();
GitDiff::parseDiff(text, &info, &diff);
} else {
diff = info;
}

Git::Object obj;
if (isValidID_(diff.blob.a_id)) { // 左が有効
obj = cat_file(g, diff.blob.a_id);
if (isValidID_(diff.blob.b_id)) { // 右が有効
if (isValidID_(diff.blob.a_id_or_path)) { // 左が有効
obj = cat_file(g, diff.blob.a_id_or_path);
if (isValidID_(diff.blob.b_id_or_path)) { // 右が有効
setSideBySide(diff, obj.content, uncommited, g->workingDir()); // 通常のdiff表示
} else {
setLeftOnly(diff, obj.content); // 右が無効の時は、削除されたファイル
}
} else if (isValidID_(diff.blob.b_id)) { // 左が無効で右が有効の時は、追加されたファイル
obj = cat_file(g, diff.blob.b_id);
} else if (isValidID_(diff.blob.b_id_or_path)) { // 左が無効で右が有効の時は、追加されたファイル
obj = cat_file(g, diff.blob.b_id_or_path);
setRightOnly(diff, obj.content);
}
}
Expand All @@ -700,13 +700,13 @@ void FileDiffWidget::updateDiffView(QString const &id_left, QString const &id_ri

Git::Diff diff;
diff.path = path;
diff.blob.a_id = id_left;
diff.blob.b_id = id_right;
diff.blob.a_id_or_path = id_left;
diff.blob.b_id_or_path = id_right;
diff.mode = "0";
std::string text = diffObjects(g, diff.blob.a_id, diff.blob.b_id).toStdString();
std::string text = diffObjects(g, diff.blob.a_id_or_path, diff.blob.b_id_or_path).toStdString();
GitDiff::parseDiff(text, &diff, &diff);

Git::Object obj = cat_file(g, diff.blob.a_id);
Git::Object obj = cat_file(g, diff.blob.a_id_or_path);
setSideBySide(diff, obj.content, false, g->workingDir());

ui->widget_diff_slider->clear(false);
Expand Down Expand Up @@ -781,7 +781,7 @@ void FileDiffWidget::onDiffWidgetResized()

void FileDiffWidget::on_toolButton_fullscreen_clicked()
{
if (m->init_param_.diff.blob.a_id.isEmpty() && m->init_param_.diff.blob.b_id.isEmpty()) {
if (m->init_param_.diff.blob.a_id_or_path.isEmpty() && m->init_param_.diff.blob.b_id_or_path.isEmpty()) {
return;
}

Expand Down
6 changes: 3 additions & 3 deletions src/Git.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1657,8 +1657,8 @@ void Git::Diff::makeForSingleFile(Git::Diff *diff, QString const &id_a, QString
{
diff->diff = QString("diff --git a/%1 b/%2").arg(path).arg(path);
diff->index = QString("index %1..%2 %3").arg(id_a).arg(id_b).arg(0);
diff->blob.a_id = id_a;
diff->blob.b_id = id_b;
diff->blob.a_id_or_path = id_a;
diff->blob.b_id_or_path = id_b;
diff->path = path;
diff->mode = mode;
diff->type = Git::Diff::Type::Create;
Expand All @@ -1677,7 +1677,7 @@ void parseDiff(std::string const &s, Git::Diff const *info, Git::Diff *out)


out->diff = QString("diff --git ") + ("a/" + info->path) + ' ' + ("b/" + info->path);
out->index = QString("index ") + info->blob.a_id + ".." + info->blob.b_id + ' ' + info->mode;
out->index = QString("index ") + info->blob.a_id_or_path + ".." + info->blob.b_id_or_path + ' ' + info->mode;
out->path = info->path;
out->blob = info->blob;

Expand Down
4 changes: 2 additions & 2 deletions src/Git.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,8 @@ class Git : QObject {
QString path;
QString mode;
struct BLOB_AB_ {
QString a_id;
QString b_id;
QString a_id_or_path; // コミットIDまたはファイルパス。パスのときは PATH_PREFIX('*')で始まる
QString b_id_or_path;
} blob;
QList<Hunk> hunks;
struct SubmoduleDetail {
Expand Down
28 changes: 14 additions & 14 deletions src/GitDiff.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,14 @@ GitPtr GitDiff::git(Git::SubmoduleItem const &submod)
return objcache->git(submod);
}

QString GitDiff::makeKey(Git::CommitID const &a_id, Git::CommitID const &b_id)
QString GitDiff::makeKey(QString const &a_id, QString const &b_id)
{
return a_id.toQString() + ".." + b_id.toQString();
return a_id + ".." + b_id;
}

QString GitDiff::makeKey(Git::Diff const &diff)
{
return makeKey(diff.blob.a_id, diff.blob.b_id);
return makeKey(diff.blob.a_id_or_path, diff.blob.b_id_or_path);
}

QString GitDiff::prependPathPrefix(QString const &path)
Expand Down Expand Up @@ -92,7 +92,7 @@ void GitDiff::parseDiff(std::string const &s, Git::Diff const *info, Git::Diff *
}

out->diff = QString("diff --git ") + ("a/" + info->path) + ' ' + ("b/" + info->path);
out->index = QString("index ") + info->blob.a_id + ".." + info->blob.b_id + ' ' + info->mode;
out->index = QString("index ") + info->blob.a_id_or_path + ".." + info->blob.b_id_or_path + ' ' + info->mode;
out->path = info->path;
out->blob = info->blob;
out->a_submodule.item = info->a_submodule.item;
Expand Down Expand Up @@ -217,8 +217,8 @@ bool GitDiff::diff(Git::CommitID const &id, const QList<Git::SubmoduleItem> &sub
diff.index = QString("index %1..%2 %3").arg(item.a.id).arg(item.b.id).arg(item.b.mode);
diff.path = file;
diff.mode = item.b.mode;
if (Git::isValidID(item.a.id)) diff.blob.a_id = item.a.id;
if (Git::isValidID(item.b.id)) diff.blob.b_id = item.b.id;
if (Git::isValidID(item.a.id)) diff.blob.a_id_or_path = item.a.id;
if (Git::isValidID(item.b.id)) diff.blob.b_id_or_path = item.b.id;

#if 0
if (!diff.blob.a_id.isEmpty()) {
Expand Down Expand Up @@ -286,20 +286,20 @@ bool GitDiff::diff(Git::CommitID const &id, const QList<Git::SubmoduleItem> &sub

GitTreeItem treeitem;
if (head_tree.lookup(path, &treeitem)) {
item.blob.a_id = treeitem.id; // HEADにおけるこのファイルのID
item.blob.a_id_or_path = treeitem.id; // HEADにおけるこのファイルのID
if (fs.isDeleted()) { // 削除されてる
item.blob.b_id = zeros; // 削除された
item.blob.b_id_or_path = zeros; // 削除された
} else {
item.blob.b_id = prependPathPrefix(path); // IDの代わりに実在するファイルパスを入れる
item.blob.b_id_or_path = prependPathPrefix(path); // IDの代わりに実在するファイルパスを入れる
}
item.mode = treeitem.mode;
} else {
item.blob.a_id = zeros;
item.blob.b_id = prependPathPrefix(path); // 実在するファイルパス
item.blob.a_id_or_path = zeros;
item.blob.b_id_or_path = prependPathPrefix(path); // 実在するファイルパス
}

item.diff = QString("diff --git a/%1 b/%2").arg(path).arg(path);
item.index = QString("index %1..%2 %3").arg(item.blob.a_id).arg(zeros).arg(item.mode);
item.index = QString("index %1..%2 %3").arg(item.blob.a_id_or_path).arg(zeros).arg(item.mode);
item.path = path;

diffs.push_back(item);
Expand All @@ -326,8 +326,8 @@ bool GitDiff::diff(Git::CommitID const &id, const QList<Git::SubmoduleItem> &sub
*out = {};
}
};
Do(diff->blob.a_id, &diff->a_submodule);
Do(diff->blob.b_id, &diff->b_submodule);
Do(diff->blob.a_id_or_path, &diff->a_submodule);
Do(diff->blob.b_id_or_path, &diff->b_submodule);
break;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/GitDiff.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class GitDiff {
static QString diffObjects(GitPtr g, QString const &a_id, QString const &b_id);
static QString diffFiles(GitPtr g, QString const &a_path, QString const &b_path);
static void parseDiff(std::string const &s, const Git::Diff *info, Git::Diff *out);
static QString makeKey(const Git::CommitID &a_id, const Git::CommitID &b_id);
static QString makeKey(const QString &a_id, const QString &b_id);
static QString makeKey(const Git::Diff &diff);
static QString prependPathPrefix(QString const &path);

Expand Down
2 changes: 1 addition & 1 deletion src/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2930,7 +2930,7 @@ void MainWindow::addDiffItems(const QList<Git::Diff> *diff_list, const std::func
}

ObjectData data;
data.id = diff.blob.b_id;
data.id = diff.blob.b_id_or_path;
data.path = diff.path;
data.submod = diff.b_submodule.item;
data.submod_commit = diff.b_submodule.commit;
Expand Down

0 comments on commit dcd4bdb

Please sign in to comment.