mirror of
https://github.com/kahole/edamagit.git
synced 2024-10-05 19:47:53 +03:00
Support fold/unfold diff hunks in stash detail view
This commit is contained in:
parent
9fedb1702c
commit
93bf37d150
@ -3,6 +3,7 @@ import { MagitRepository } from '../models/magitRepository';
|
||||
import { gitRun } from '../utils/gitRawRunner';
|
||||
import { DiffView } from '../views/diffView';
|
||||
import { MenuUtil, MenuState } from '../menu/menu';
|
||||
import GitTextUtils from '../utils/gitTextUtils';
|
||||
import { PickMenuUtil, PickMenuItem } from '../menu/pickMenu';
|
||||
import { StashDetailView } from '../views/stashDetailView';
|
||||
import MagitUtils from '../utils/magitUtils';
|
||||
@ -14,6 +15,7 @@ import { Status } from '../typings/git';
|
||||
import { MagitChange } from '../models/magitChange';
|
||||
import { Stash } from '../models/stash';
|
||||
import ViewUtils from '../utils/viewUtils';
|
||||
import { constants } from 'buffer';
|
||||
|
||||
const diffingMenu = {
|
||||
title: 'Diffing',
|
||||
@ -102,9 +104,51 @@ async function showStash({ repository }: MenuState) {
|
||||
}
|
||||
}
|
||||
|
||||
function toMagitChange(nameStatusText: string, diff: string): MagitChange[] {
|
||||
const DIFF_PREFIX = 'diff --git';
|
||||
const filesWithStatus = nameStatusText.split(Constants.LineSplitterRegex).filter(t => t !== '').map(s => s.split('\t'));
|
||||
const diffs = diff.split(DIFF_PREFIX).filter(r => r !== '');
|
||||
|
||||
if (filesWithStatus.length !== diffs.length) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return diffs.map((diff, idx) => {
|
||||
const [status, ...paths] = filesWithStatus[idx];
|
||||
const uri = Uri.file(paths[paths.length - 1]);
|
||||
const fileStatus = getStatusFromString(status);
|
||||
return {
|
||||
diff,
|
||||
uri,
|
||||
originalUri: uri,
|
||||
status: fileStatus,
|
||||
renameUri: undefined,
|
||||
relativePath: paths.join(' -> '),
|
||||
hunks: diff ? GitTextUtils.diffToHunks(diff, uri) : undefined,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
function getStatusFromString(status: String): number {
|
||||
switch (status.charAt(0)) {
|
||||
case 'A':
|
||||
return Status.INDEX_ADDED;
|
||||
case 'C':
|
||||
return Status.INDEX_COPIED ;
|
||||
case 'D':
|
||||
return Status.DELETED;
|
||||
case 'R' :
|
||||
return Status.INDEX_RENAMED;
|
||||
case 'M':
|
||||
default:
|
||||
return Status.MODIFIED;
|
||||
}
|
||||
}
|
||||
|
||||
export async function showStashDetail(repository: MagitRepository, stash: Stash) {
|
||||
const uri = StashDetailView.encodeLocation(repository, stash);
|
||||
|
||||
const nameStatusTask = gitRun(repository.gitRepository, ['stash', 'show', '--name-status', `stash@{${stash.index}}`]);
|
||||
const stashShowTask = gitRun(repository.gitRepository, ['stash', 'show', '-p', `stash@{${stash.index}}`]);
|
||||
let stashUntrackedFiles: MagitChange[] = [];
|
||||
try {
|
||||
@ -124,9 +168,10 @@ export async function showStashDetail(repository: MagitRepository, stash: Stash)
|
||||
|
||||
} catch { }
|
||||
|
||||
const nameStatusText = (await nameStatusTask).stdout;
|
||||
const stashDiff = (await stashShowTask).stdout;
|
||||
|
||||
return ViewUtils.showView(uri, new StashDetailView(uri, stash, stashDiff, stashUntrackedFiles));
|
||||
return ViewUtils.showView(uri, new StashDetailView(uri, stash, toMagitChange(nameStatusText, stashDiff), stashUntrackedFiles));
|
||||
}
|
||||
|
||||
async function showCommit({ repository }: MenuState) {
|
||||
|
@ -18,6 +18,7 @@ export enum Section {
|
||||
Tags = 'Tags',
|
||||
PullRequests = 'Pull Requests',
|
||||
Issues = 'Issues',
|
||||
Changes='Changes',
|
||||
}
|
||||
|
||||
export class SectionHeaderView extends UnclickableTextView {
|
||||
|
@ -13,7 +13,7 @@ export class StashDetailView extends DocumentView {
|
||||
static UriPath: string = 'stash.magit';
|
||||
needsUpdate = false;
|
||||
|
||||
constructor(public uri: Uri, stash: Stash, diff: string, untrackedFiles: MagitChange[]) {
|
||||
constructor(public uri: Uri, stash: Stash, diffChanges: MagitChange[], untrackedFiles: MagitChange[] ) {
|
||||
super(uri);
|
||||
|
||||
this.addSubview(new TextView(`Stash@{${stash.index}} ${stash.description}`));
|
||||
@ -22,7 +22,7 @@ export class StashDetailView extends DocumentView {
|
||||
this.addSubview(new ChangeSectionView(Section.Untracked, untrackedFiles, `-stashDetail@{${stash.index}}`));
|
||||
}
|
||||
|
||||
this.addSubview(new TextView(diff));
|
||||
this.addSubview(new ChangeSectionView(Section.Changes, diffChanges, `-stashDetail@{${stash.index}}`));
|
||||
}
|
||||
|
||||
public update(state: MagitRepository): void { }
|
||||
|
@ -38,7 +38,7 @@
|
||||
]
|
||||
},
|
||||
"sectionHeader": {
|
||||
"match": "^(Untracked files|((Unstaged|Staged) changes)|Stashes|Recent commits|Unmerged into|Unpushed to|Unpulled from|HEAD|Branches|Remote|Tags|Pull Requests|Issues|GitError!|(Merging .*(?= \\())|(Rebasing .* onto .*$)|Cherry Picking|Reverting|Stash@{\\d+}|(Commits in .*$))",
|
||||
"match": "^(Untracked files|((Unstaged|Staged) changes)|Stashes|Recent commits|Unmerged into|Unpushed to|Unpulled from|HEAD|Branches|Remote|Tags|Pull Requests|Issues|GitError!|(Merging .*(?= \\())|(Rebasing .* onto .*$)|Cherry Picking|Reverting|Stash@{\\d+}|(Commits in .*$))|Changes",
|
||||
"name": "strong keyword.operator.new.section.header.magit magit.header"
|
||||
},
|
||||
"highlight": {
|
||||
|
Loading…
Reference in New Issue
Block a user