Adds status information to log commits

Adds status info to commit details quick pick
This commit is contained in:
Eric Amodio
2017-02-27 02:50:33 -05:00
parent 73c58bc923
commit 0f0a653c4c
6 changed files with 86 additions and 80 deletions

View File

@@ -2,10 +2,23 @@
import { commands, QuickPickItem, TextEditor, Uri, window, workspace } from 'vscode';
import { Commands } from '../commands';
import { BuiltInCommands } from '../constants';
import { GitCommit, GitFileStatusItem, GitUri } from '../gitProvider';
import { GitCommit, GitFileStatus, GitFileStatusItem, GitLogCommit, GitUri } from '../gitProvider';
import * as moment from 'moment';
import * as path from 'path';
const statusOcticonsMap = {
'?': '$(diff-ignored)',
A: '$(diff-added)',
C: '$(diff-added)',
D: '$(diff-removed)',
M: '$(diff-modified)',
R: '$(diff-renamed)',
U: '$(question)'
};
function getStatusIcon(status: GitFileStatus, missing: string = '\u00a0\u00a0\u00a0\u00a0'): string {
return statusOcticonsMap[status] || missing;
}
export interface PartialQuickPickItem {
label?: string;
description?: string;
@@ -58,13 +71,9 @@ export class OpenFilesCommandQuickPickItem extends CommandQuickPickItem {
export class OpenCommitFilesCommandQuickPickItem extends OpenFilesCommandQuickPickItem {
constructor(commit: GitCommit, fileNames?: string[], item?: PartialQuickPickItem) {
constructor(commit: GitLogCommit, item?: PartialQuickPickItem) {
const repoPath = commit.repoPath;
if (!fileNames) {
fileNames = commit.fileName.split(', ').filter(_ => !!_);
}
item = {
...{
label: `$(file-symlink-file) Open Files`,
@@ -74,7 +83,7 @@ export class OpenCommitFilesCommandQuickPickItem extends OpenFilesCommandQuickPi
...item
};
super(fileNames, repoPath, item as QuickPickItem);
super(commit.fileStatuses.map(_ => _.fileName), repoPath, item as QuickPickItem);
}
}
@@ -133,15 +142,6 @@ export class OpenCommitFileCommandQuickPickItem extends OpenFileCommandQuickPick
}
}
const statusOcticons = [
'\u00a0$(question)',
'\u00a0$(diff-ignored)',
'\u00a0$(diff-added)',
'\u00a0$(diff-modified)',
'\u00a0$(diff-removed)',
'\u00a0$(diff-renamed)'
];
export class OpenStatusFileCommandQuickPickItem extends OpenFileCommandQuickPickItem {
constructor(status: GitFileStatusItem, item?: PartialQuickPickItem) {
@@ -150,9 +150,10 @@ export class OpenStatusFileCommandQuickPickItem extends OpenFileCommandQuickPick
directory = undefined;
}
const icon = getStatusIcon(status.status);
item = {
...{
label: `${status.staged ? '$(check)' : '\u00a0\u00a0\u00a0'}\u00a0${statusOcticons[status.status]}\u00a0\u00a0\u00a0${path.basename(status.fileName)}`,
label: `${status.staged ? '$(check)' : '\u00a0\u00a0\u00a0'}\u00a0\u00a0${icon}\u00a0\u00a0\u00a0${path.basename(status.fileName)}`,
description: directory
},
...item
@@ -184,8 +185,9 @@ export class FileQuickPickItem implements QuickPickItem {
sha: string;
uri: GitUri;
constructor(commit: GitCommit, public fileName: string) {
this.label = `$(info) ${path.basename(fileName)}`;
constructor(commit: GitCommit, public fileName: string, public status: GitFileStatus) {
const icon = getStatusIcon(status);
this.label = `${icon} ${path.basename(fileName)}`;
let directory = path.dirname(fileName);
if (!directory || directory === '.') {

View File

@@ -3,7 +3,7 @@ import { Iterables } from '../system';
import { QuickPickOptions, Uri, window, workspace } from 'vscode';
import { IAdvancedConfig } from '../configuration';
import { Commands } from '../commands';
import GitProvider, { GitCommit, GitFileStatus, GitFileStatusItem, GitUri, IGitLog } from '../gitProvider';
import GitProvider, { GitCommit, GitFileStatusItem, GitLogCommit, GitUri, IGitLog } from '../gitProvider';
import { CommandQuickPickItem, CommitQuickPickItem, FileQuickPickItem, OpenCommitFileCommandQuickPickItem, OpenStatusFileCommandQuickPickItem, OpenCommitFilesCommandQuickPickItem, OpenStatusFilesCommandQuickPickItem } from './quickPickItems';
import * as moment from 'moment';
import * as path from 'path';
@@ -88,11 +88,10 @@ export class CommitQuickPick {
export class CommitFilesQuickPick {
static async show(commit: GitCommit, uri: Uri, goBackCommand?: CommandQuickPickItem): Promise<FileQuickPickItem | CommandQuickPickItem | undefined> {
const fileNames = commit.fileName.split(', ').filter(_ => !!_);
const items: (FileQuickPickItem | CommandQuickPickItem)[] = fileNames.map(f => new FileQuickPickItem(commit, f));
static async show(commit: GitLogCommit, uri: Uri, goBackCommand?: CommandQuickPickItem): Promise<FileQuickPickItem | CommandQuickPickItem | undefined> {
const items: (FileQuickPickItem | CommandQuickPickItem)[] = commit.fileStatuses.map(fs => new FileQuickPickItem(commit, fs.fileName, fs.status));
items.splice(0, 0, new OpenCommitFilesCommandQuickPickItem(commit, fileNames));
items.splice(0, 0, new OpenCommitFilesCommandQuickPickItem(commit));
items.splice(1, 0, new CommandQuickPickItem({
label: `$(clippy) Copy Commit Sha to Clipboard`,
@@ -201,13 +200,13 @@ export class RepoStatusesQuickPick {
if (statuses.some(_ => _.staged)) {
const index = statuses.findIndex(_ => !_.staged);
if (index > -1) {
items.splice(index, 0, new OpenStatusFilesCommandQuickPickItem(statuses.filter(_ => _.status !== GitFileStatus.Deleted && !_.staged), {
items.splice(index, 0, new OpenStatusFilesCommandQuickPickItem(statuses.filter(_ => _.status !== 'D' && !_.staged), {
label: `$(file-symlink-file) Open Unstaged Files`,
description: undefined,
detail: `Opens all of the unstaged files in the repository`
}));
items.splice(0, 0, new OpenStatusFilesCommandQuickPickItem(statuses.filter(_ => _.status !== GitFileStatus.Deleted && _.staged), {
items.splice(0, 0, new OpenStatusFilesCommandQuickPickItem(statuses.filter(_ => _.status !== 'D' && _.staged), {
label: `$(file-symlink-file) Open Staged Files`,
description: undefined,
detail: `Opens all of the staged files in the repository`
@@ -216,7 +215,7 @@ export class RepoStatusesQuickPick {
}
if (statuses.length) {
items.splice(0, 0, new OpenStatusFilesCommandQuickPickItem(statuses.filter(_ => _.status !== GitFileStatus.Deleted)));
items.splice(0, 0, new OpenStatusFilesCommandQuickPickItem(statuses.filter(_ => _.status !== 'D')));
}
if (goBackCommand) {

View File

@@ -2,7 +2,7 @@
import { Iterables } from '../system';
import { commands, TextEditor, Uri, window } from 'vscode';
import { ActiveEditorCommand, Commands } from '../commands';
import GitProvider, { GitCommit, GitUri } from '../gitProvider';
import GitProvider, { GitCommit, GitLogCommit, GitUri } from '../gitProvider';
import { Logger } from '../logger';
import { CommandQuickPickItem, FileQuickPickItem } from './quickPickItems';
import { CommitQuickPick, CommitFilesQuickPick } from './quickPicks';
@@ -54,7 +54,7 @@ export default class ShowQuickCommitDetailsCommand extends ActiveEditorCommand {
commit = Iterables.first(log.commits.values());
pick = await CommitFilesQuickPick.show(commit, uri, goBackCommand);
pick = await CommitFilesQuickPick.show(commit as GitLogCommit, uri, goBackCommand);
if (!pick) return undefined;
if (pick instanceof CommandQuickPickItem) {