2011-01-24 22:18:41 +01:00
|
|
|
<?php
|
|
|
|
|
2012-03-13 19:18:11 +01:00
|
|
|
final class DifferentialChangesetDetailView extends AphrontView {
|
2011-01-24 22:18:41 +01:00
|
|
|
|
2011-01-25 20:57:47 +01:00
|
|
|
private $changeset;
|
|
|
|
private $buttons = array();
|
2012-04-11 00:00:09 +02:00
|
|
|
private $editable;
|
Tie all the pieces for symbol cross-references together
Summary:
This makes symbol cross-references work in Differential. You need to do a little
legwork but I'll document that once the change has baked for a little while.
Basically:
- Projects are annotated with indexed languages, and "shared library" projects
(for example, symbols in Phabricator should be searched for in Arcanist and
libphutil).
- When we render a changeset, we check if its language is an indexed one. If
it is, we invoke the decorator Javascript.
- The Javascript takes you to a lookup page, which either gives you a list of
matching symbols (if several match) or redirects you instantly to the
definition.
Test Plan: Clicked class and function symbols in a diff, got jumped into
sensible sorts of places in Diffusion.
Reviewers: jungejason, nh, tuomaspelkonen, aran
Reviewed By: jungejason
CC: aran, jungejason
Differential Revision: 980
2011-10-03 01:02:56 +02:00
|
|
|
private $symbolIndex;
|
2012-01-06 05:29:16 +01:00
|
|
|
private $id;
|
Resolve great internal confusion about left vs right inline comments
Summary:
This code was just all kinds of wrong, but got all the common cases anyone cares
about correct.
- In edit-inline-comments.js, if isOnRight() is true, use data.right, not
data.left (derp).
- Set data.left correctly, not to the same value as data.right (derp derp).
- Set "isNewFile" based on $is_new, not $on_right (derp derp derp).
Test Plan:
- Added JS debugging code to print "OLD" vs "NEW" and "LEFT" vs "RIGHT".
Clicked the left and right sides of diff-vs-base and diff-vs-diff diffs,
verified output was accurate in all cases.
- Added comments to the left-display-side of a diff-of-diffs, saved them, they
showed up where I put them.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran, epriestley
Maniphest Tasks: T543
Differential Revision: https://secure.phabricator.com/D1567
2012-02-04 00:26:47 +01:00
|
|
|
private $vsChangesetID;
|
Consolidate changeset rendering logic
Summary:
Ref T5179. Currently, all the changeset rendering logic is in the "populate" behavior, and a lot of it comes in via configuration and is hard to get at.
Instead, surface an object which can control it, and which other behaviors can access more easily.
In particular, this allows us to add a "Load/Reload" item to the view options menu, which would previously have been very challenging.
Load/Reload isn't useful on its own, but is a step away from "Show whitespace as...", "Highlight as...", "Show tabtops as...", "View Unified", "View Side-By-Side", etc.
Test Plan:
- Viewed Differential.
- Viewed Diffusion.
- Viewed large changesets, clicked "Load".
- Used "Load" and "Reload" from view options menu.
- Loaded all changes in a large diff, verified "Load" and TOC clicks take precedence over other content loads.
- Played with content stability stuff.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5179
Differential Revision: https://secure.phabricator.com/D9286
2014-05-25 16:13:22 +02:00
|
|
|
private $renderURI;
|
|
|
|
private $whitespace;
|
|
|
|
private $renderingRef;
|
|
|
|
private $autoload;
|
|
|
|
|
|
|
|
public function setAutoload($autoload) {
|
|
|
|
$this->autoload = $autoload;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getAutoload() {
|
|
|
|
return $this->autoload;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setRenderingRef($rendering_ref) {
|
|
|
|
$this->renderingRef = $rendering_ref;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getRenderingRef() {
|
|
|
|
return $this->renderingRef;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setWhitespace($whitespace) {
|
|
|
|
$this->whitespace = $whitespace;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getWhitespace() {
|
|
|
|
return $this->whitespace;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setRenderURI($render_uri) {
|
|
|
|
$this->renderURI = $render_uri;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getRenderURI() {
|
|
|
|
return $this->renderURI;
|
|
|
|
}
|
2011-01-24 22:18:41 +01:00
|
|
|
|
2011-01-25 20:57:47 +01:00
|
|
|
public function setChangeset($changeset) {
|
|
|
|
$this->changeset = $changeset;
|
2011-01-24 22:18:41 +01:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-01-25 20:57:47 +01:00
|
|
|
public function addButton($button) {
|
|
|
|
$this->buttons[] = $button;
|
|
|
|
return $this;
|
|
|
|
}
|
2011-01-24 22:18:41 +01:00
|
|
|
|
2012-04-11 00:00:09 +02:00
|
|
|
public function setEditable($editable) {
|
|
|
|
$this->editable = $editable;
|
2011-04-15 23:25:23 +02:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
Tie all the pieces for symbol cross-references together
Summary:
This makes symbol cross-references work in Differential. You need to do a little
legwork but I'll document that once the change has baked for a little while.
Basically:
- Projects are annotated with indexed languages, and "shared library" projects
(for example, symbols in Phabricator should be searched for in Arcanist and
libphutil).
- When we render a changeset, we check if its language is an indexed one. If
it is, we invoke the decorator Javascript.
- The Javascript takes you to a lookup page, which either gives you a list of
matching symbols (if several match) or redirects you instantly to the
definition.
Test Plan: Clicked class and function symbols in a diff, got jumped into
sensible sorts of places in Diffusion.
Reviewers: jungejason, nh, tuomaspelkonen, aran
Reviewed By: jungejason
CC: aran, jungejason
Differential Revision: 980
2011-10-03 01:02:56 +02:00
|
|
|
public function setSymbolIndex($symbol_index) {
|
|
|
|
$this->symbolIndex = $symbol_index;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2012-01-06 05:29:16 +01:00
|
|
|
public function getID() {
|
|
|
|
if (!$this->id) {
|
|
|
|
$this->id = celerity_generate_unique_node_id();
|
|
|
|
}
|
|
|
|
return $this->id;
|
|
|
|
}
|
|
|
|
|
Consolidate changeset rendering logic
Summary:
Ref T5179. Currently, all the changeset rendering logic is in the "populate" behavior, and a lot of it comes in via configuration and is hard to get at.
Instead, surface an object which can control it, and which other behaviors can access more easily.
In particular, this allows us to add a "Load/Reload" item to the view options menu, which would previously have been very challenging.
Load/Reload isn't useful on its own, but is a step away from "Show whitespace as...", "Highlight as...", "Show tabtops as...", "View Unified", "View Side-By-Side", etc.
Test Plan:
- Viewed Differential.
- Viewed Diffusion.
- Viewed large changesets, clicked "Load".
- Used "Load" and "Reload" from view options menu.
- Loaded all changes in a large diff, verified "Load" and TOC clicks take precedence over other content loads.
- Played with content stability stuff.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5179
Differential Revision: https://secure.phabricator.com/D9286
2014-05-25 16:13:22 +02:00
|
|
|
public function setID($id) {
|
|
|
|
$this->id = $id;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
Resolve great internal confusion about left vs right inline comments
Summary:
This code was just all kinds of wrong, but got all the common cases anyone cares
about correct.
- In edit-inline-comments.js, if isOnRight() is true, use data.right, not
data.left (derp).
- Set data.left correctly, not to the same value as data.right (derp derp).
- Set "isNewFile" based on $is_new, not $on_right (derp derp derp).
Test Plan:
- Added JS debugging code to print "OLD" vs "NEW" and "LEFT" vs "RIGHT".
Clicked the left and right sides of diff-vs-base and diff-vs-diff diffs,
verified output was accurate in all cases.
- Added comments to the left-display-side of a diff-of-diffs, saved them, they
showed up where I put them.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran, epriestley
Maniphest Tasks: T543
Differential Revision: https://secure.phabricator.com/D1567
2012-02-04 00:26:47 +01:00
|
|
|
public function setVsChangesetID($vs_changeset_id) {
|
|
|
|
$this->vsChangesetID = $vs_changeset_id;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getVsChangesetID() {
|
|
|
|
return $this->vsChangesetID;
|
|
|
|
}
|
|
|
|
|
2013-10-15 16:34:48 +02:00
|
|
|
public function getFileIcon($filename) {
|
|
|
|
$path_info = pathinfo($filename);
|
2013-10-17 20:21:01 +02:00
|
|
|
$extension = idx($path_info, 'extension');
|
2013-10-15 16:34:48 +02:00
|
|
|
switch ($extension) {
|
|
|
|
case 'psd':
|
|
|
|
case 'ai':
|
2014-05-12 19:08:32 +02:00
|
|
|
$icon = 'fa-eye';
|
2013-10-15 16:34:48 +02:00
|
|
|
break;
|
|
|
|
case 'conf':
|
2014-05-12 19:08:32 +02:00
|
|
|
$icon = 'fa-wrench';
|
2013-10-15 16:34:48 +02:00
|
|
|
break;
|
|
|
|
case 'wav':
|
|
|
|
case 'mp3':
|
|
|
|
case 'aiff':
|
2014-05-12 19:08:32 +02:00
|
|
|
$icon = 'fa-music';
|
2013-10-15 16:34:48 +02:00
|
|
|
break;
|
|
|
|
case 'm4v':
|
|
|
|
case 'mov':
|
2014-05-12 19:08:32 +02:00
|
|
|
$icon = 'fa-film';
|
2013-10-15 16:34:48 +02:00
|
|
|
break;
|
|
|
|
case 'sql';
|
|
|
|
case 'db':
|
|
|
|
case 'csv':
|
2014-05-12 19:08:32 +02:00
|
|
|
$icon = 'fa-table';
|
2013-10-15 16:34:48 +02:00
|
|
|
break;
|
|
|
|
case 'ics':
|
2014-05-12 19:08:32 +02:00
|
|
|
$icon = 'fa-calendar';
|
2013-10-15 16:34:48 +02:00
|
|
|
break;
|
|
|
|
case 'zip':
|
|
|
|
case 'tar':
|
|
|
|
case 'bz':
|
|
|
|
case 'tgz':
|
|
|
|
case 'gz':
|
2014-05-12 19:08:32 +02:00
|
|
|
$icon = 'fa-archive';
|
2013-10-15 16:34:48 +02:00
|
|
|
break;
|
|
|
|
case 'png':
|
|
|
|
case 'jpg':
|
|
|
|
case 'bmp':
|
|
|
|
case 'gif':
|
2014-05-12 19:08:32 +02:00
|
|
|
$icon = 'fa-picture-o';
|
2013-10-15 16:34:48 +02:00
|
|
|
break;
|
|
|
|
default:
|
2014-05-12 19:08:32 +02:00
|
|
|
$icon = 'fa-file';
|
2013-10-15 16:34:48 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return $icon;
|
|
|
|
}
|
|
|
|
|
2011-01-25 20:57:47 +01:00
|
|
|
public function render() {
|
2014-01-02 20:59:35 +01:00
|
|
|
$this->requireResource('differential-changeset-view-css');
|
|
|
|
$this->requireResource('syntax-highlighting-css');
|
2011-01-24 22:18:41 +01:00
|
|
|
|
Kind-of-terrible (?) oncopy handler
Summary: Works in Safari, Firefox, Chrome.
Test Plan: Copied some text, threw up a little in my mouth.
Reviewers: aran, tuomaspelkonen, tomo, rstout, btrahan
Reviewed By: aran
CC: aran, epriestley, ddfisher
Maniphest Tasks: T145, T995
Differential Revision: https://secure.phabricator.com/D244
2012-03-16 03:04:59 +01:00
|
|
|
Javelin::initBehavior('phabricator-oncopy', array());
|
|
|
|
|
2011-01-25 20:57:47 +01:00
|
|
|
$changeset = $this->changeset;
|
|
|
|
$class = 'differential-changeset';
|
2012-04-11 00:00:09 +02:00
|
|
|
if (!$this->editable) {
|
2011-01-25 20:57:47 +01:00
|
|
|
$class .= ' differential-changeset-immutable';
|
2011-01-24 22:18:41 +01:00
|
|
|
}
|
|
|
|
|
2011-05-06 21:58:53 +02:00
|
|
|
$buttons = null;
|
|
|
|
if ($this->buttons) {
|
2013-01-30 19:58:21 +01:00
|
|
|
$buttons = phutil_tag(
|
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'class' => 'differential-changeset-buttons',
|
|
|
|
),
|
|
|
|
$this->buttons);
|
2011-05-06 21:58:53 +02:00
|
|
|
}
|
|
|
|
|
2012-01-06 05:29:16 +01:00
|
|
|
$id = $this->getID();
|
Tie all the pieces for symbol cross-references together
Summary:
This makes symbol cross-references work in Differential. You need to do a little
legwork but I'll document that once the change has baked for a little while.
Basically:
- Projects are annotated with indexed languages, and "shared library" projects
(for example, symbols in Phabricator should be searched for in Arcanist and
libphutil).
- When we render a changeset, we check if its language is an indexed one. If
it is, we invoke the decorator Javascript.
- The Javascript takes you to a lookup page, which either gives you a list of
matching symbols (if several match) or redirects you instantly to the
definition.
Test Plan: Clicked class and function symbols in a diff, got jumped into
sensible sorts of places in Diffusion.
Reviewers: jungejason, nh, tuomaspelkonen, aran
Reviewed By: jungejason
CC: aran, jungejason
Differential Revision: 980
2011-10-03 01:02:56 +02:00
|
|
|
|
|
|
|
if ($this->symbolIndex) {
|
|
|
|
Javelin::initBehavior(
|
|
|
|
'repository-crossreference',
|
|
|
|
array(
|
|
|
|
'container' => $id,
|
|
|
|
) + $this->symbolIndex);
|
|
|
|
}
|
|
|
|
|
2011-01-25 20:57:47 +01:00
|
|
|
$display_filename = $changeset->getDisplayFilename();
|
2013-10-15 16:34:48 +02:00
|
|
|
$display_icon = $this->getFileIcon($display_filename);
|
|
|
|
$icon = id(new PHUIIconView())
|
2014-05-12 19:08:32 +02:00
|
|
|
->setIconFont($display_icon);
|
2012-02-23 21:26:14 +01:00
|
|
|
|
2013-01-30 19:58:21 +01:00
|
|
|
return javelin_tag(
|
2011-01-25 20:57:47 +01:00
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'sigil' => 'differential-changeset',
|
2011-02-02 01:42:36 +01:00
|
|
|
'meta' => array(
|
Resolve great internal confusion about left vs right inline comments
Summary:
This code was just all kinds of wrong, but got all the common cases anyone cares
about correct.
- In edit-inline-comments.js, if isOnRight() is true, use data.right, not
data.left (derp).
- Set data.left correctly, not to the same value as data.right (derp derp).
- Set "isNewFile" based on $is_new, not $on_right (derp derp derp).
Test Plan:
- Added JS debugging code to print "OLD" vs "NEW" and "LEFT" vs "RIGHT".
Clicked the left and right sides of diff-vs-base and diff-vs-diff diffs,
verified output was accurate in all cases.
- Added comments to the left-display-side of a diff-of-diffs, saved them, they
showed up where I put them.
Reviewers: btrahan, vrana
Reviewed By: btrahan
CC: aran, epriestley
Maniphest Tasks: T543
Differential Revision: https://secure.phabricator.com/D1567
2012-02-04 00:26:47 +01:00
|
|
|
'left' => nonempty(
|
|
|
|
$this->getVsChangesetID(),
|
|
|
|
$this->changeset->getID()),
|
2011-02-02 01:42:36 +01:00
|
|
|
'right' => $this->changeset->getID(),
|
Consolidate changeset rendering logic
Summary:
Ref T5179. Currently, all the changeset rendering logic is in the "populate" behavior, and a lot of it comes in via configuration and is hard to get at.
Instead, surface an object which can control it, and which other behaviors can access more easily.
In particular, this allows us to add a "Load/Reload" item to the view options menu, which would previously have been very challenging.
Load/Reload isn't useful on its own, but is a step away from "Show whitespace as...", "Highlight as...", "Show tabtops as...", "View Unified", "View Side-By-Side", etc.
Test Plan:
- Viewed Differential.
- Viewed Diffusion.
- Viewed large changesets, clicked "Load".
- Used "Load" and "Reload" from view options menu.
- Loaded all changes in a large diff, verified "Load" and TOC clicks take precedence over other content loads.
- Played with content stability stuff.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5179
Differential Revision: https://secure.phabricator.com/D9286
2014-05-25 16:13:22 +02:00
|
|
|
'renderURI' => $this->getRenderURI(),
|
|
|
|
'whitespace' => $this->getWhitespace(),
|
|
|
|
'highlight' => null,
|
|
|
|
'renderer' => null,
|
|
|
|
'ref' => $this->getRenderingRef(),
|
|
|
|
'autoload' => $this->getAutoload(),
|
2011-02-02 01:42:36 +01:00
|
|
|
),
|
2011-01-25 20:57:47 +01:00
|
|
|
'class' => $class,
|
Tie all the pieces for symbol cross-references together
Summary:
This makes symbol cross-references work in Differential. You need to do a little
legwork but I'll document that once the change has baked for a little while.
Basically:
- Projects are annotated with indexed languages, and "shared library" projects
(for example, symbols in Phabricator should be searched for in Arcanist and
libphutil).
- When we render a changeset, we check if its language is an indexed one. If
it is, we invoke the decorator Javascript.
- The Javascript takes you to a lookup page, which either gives you a list of
matching symbols (if several match) or redirects you instantly to the
definition.
Test Plan: Clicked class and function symbols in a diff, got jumped into
sensible sorts of places in Diffusion.
Reviewers: jungejason, nh, tuomaspelkonen, aran
Reviewed By: jungejason
CC: aran, jungejason
Differential Revision: 980
2011-10-03 01:02:56 +02:00
|
|
|
'id' => $id,
|
2011-01-25 20:57:47 +01:00
|
|
|
),
|
2013-03-09 22:52:41 +01:00
|
|
|
array(
|
|
|
|
id(new PhabricatorAnchorView())
|
|
|
|
->setAnchorName($changeset->getAnchorName())
|
|
|
|
->setNavigationMarker(true)
|
|
|
|
->render(),
|
|
|
|
$buttons,
|
2013-10-15 16:34:48 +02:00
|
|
|
phutil_tag('h1',
|
|
|
|
array(
|
|
|
|
'class' => 'differential-file-icon-header'),
|
|
|
|
array(
|
|
|
|
$icon,
|
Consolidate changeset rendering logic
Summary:
Ref T5179. Currently, all the changeset rendering logic is in the "populate" behavior, and a lot of it comes in via configuration and is hard to get at.
Instead, surface an object which can control it, and which other behaviors can access more easily.
In particular, this allows us to add a "Load/Reload" item to the view options menu, which would previously have been very challenging.
Load/Reload isn't useful on its own, but is a step away from "Show whitespace as...", "Highlight as...", "Show tabtops as...", "View Unified", "View Side-By-Side", etc.
Test Plan:
- Viewed Differential.
- Viewed Diffusion.
- Viewed large changesets, clicked "Load".
- Used "Load" and "Reload" from view options menu.
- Loaded all changes in a large diff, verified "Load" and TOC clicks take precedence over other content loads.
- Played with content stability stuff.
Reviewers: btrahan
Reviewed By: btrahan
Subscribers: epriestley
Maniphest Tasks: T5179
Differential Revision: https://secure.phabricator.com/D9286
2014-05-25 16:13:22 +02:00
|
|
|
$display_filename,
|
|
|
|
)),
|
|
|
|
javelin_tag(
|
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'class' => 'changeset-view-content',
|
|
|
|
'sigil' => 'changeset-view-content',
|
|
|
|
),
|
|
|
|
$this->renderChildren()),
|
2013-03-09 22:52:41 +01:00
|
|
|
));
|
2011-01-24 22:18:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|