| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| /* |
| * git/status is a Pipe Viewer that displays output of "git status --short" |
| * in a graphical grid. |
| * Only supported with Git's --short flag. |
| * @tutorial git status --short | p2b users/jane@google.com/chrome/p2b/[name]/git/status |
| * @fileoverview |
| */ |
| import { View } from 'view'; |
| import { PipeViewer } from 'pipe-viewer'; |
| import { streamUtil } from 'stream-helpers'; |
| import { Logger } from 'logger'; |
| import { parse } from './parser'; |
| import { gitStatusDataSource } from './data-source'; |
| |
| var log = new Logger('pipe-viewers/builtin/git/status'); |
| |
| class GitStatusPipeViewer extends PipeViewer { |
| get name() { |
| return 'git/status'; |
| } |
| |
| play(stream) { |
| stream.setEncoding('utf8'); |
| |
| // split by new line |
| stream = stream.pipe(streamUtil.split(/\r?\n/)); |
| |
| // parse the git status items |
| stream = stream.pipe(streamUtil.map((line, cb) => { |
| if (line.trim() === '') { |
| // eliminate the item |
| cb(); |
| return; |
| } |
| var item; |
| try { |
| item = parse(line); |
| } catch(e) { |
| log.debug(e); |
| } |
| if (item) { |
| addAdditionalUIProperties(item); |
| cb(null, item); |
| } else { |
| // eliminate the item |
| cb(); |
| } |
| })); |
| |
| // we return a view promise instead of a view since we want to wait |
| // until all items arrive before showing the data. |
| var viewPromise = new Promise(function(resolve,reject) { |
| // write into an array when stream is done return the UI component |
| stream.pipe(streamUtil.writeArray((err, items) => { |
| if (err) { |
| reject(err); |
| } else { |
| var statusView = document.createElement('p2b-plugin-git-status'); |
| statusView.dataSource = new gitStatusDataSource(items); |
| resolve(new View(statusView)); |
| } |
| })); |
| }); |
| |
| return viewPromise; |
| } |
| } |
| |
| /* |
| * Adds additional UI specific properties to the item |
| * @private |
| */ |
| function addAdditionalUIProperties(item) { |
| addActionIconProperty(item); |
| addStateIconProperty(item); |
| addFileNameFileParentProperty(item); |
| } |
| |
| /* |
| * Adds an icon property to the item specifying what icon to display |
| * based on state |
| * @private |
| */ |
| function addStateIconProperty(item) { |
| var iconName; |
| switch (item.state) { |
| case 'staged': |
| iconName = 'check-circle'; |
| break; |
| case 'notstaged': |
| iconName = 'warning'; |
| break; |
| case 'conflicted': |
| iconName = 'block'; |
| break; |
| case 'untracked': |
| iconName = 'error'; |
| break; |
| case 'ignored': |
| iconName = 'visibility-off'; |
| break; |
| } |
| |
| item.stateIcon = iconName; |
| } |
| |
| /* |
| * Adds an icon property to the item specifying what icon to display |
| * based on action |
| * @private |
| */ |
| function addActionIconProperty(item) { |
| var iconName; |
| switch (item.action) { |
| case 'added': |
| iconName = 'add'; |
| break; |
| case 'deleted': |
| iconName = 'clear'; |
| break; |
| case 'modified': |
| iconName = 'translate'; |
| break; |
| case 'renamed': |
| iconName = 'swap-horiz'; |
| break; |
| case 'copied': |
| iconName = 'content-copy'; |
| break; |
| case 'unknown': |
| iconName = 'remove'; |
| break; |
| } |
| |
| item.actionIcon = iconName; |
| } |
| |
| /* |
| * Splits file into filename and fileParent |
| * @private |
| */ |
| function addFileNameFileParentProperty(item) { |
| |
| var filename = item.file; |
| var fileParent = "./"; |
| |
| var slashIndex = item.file.lastIndexOf('/'); |
| |
| if (slashIndex > 0) { |
| filename = item.file.substr(slashIndex + 1); |
| fileParent = item.file.substring(0, slashIndex); |
| } |
| |
| item.filename = filename; |
| item.fileParent = fileParent; |
| } |
| |
| export default GitStatusPipeViewer; |