@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add "DiffusionRawDiffQuery"

Summary:
- This is only slightly useful for updating Differential, since DiffQuery (vs RawDiffQuery) already gets you most of what you need. The only thing is that DiffQuery returns the diff for one path only right now(and the SVN version is very "special"). Should be easy to fix in the Git/HG cases at least, though (or maybe just use RawDiffQuery to avoid the SVN mess).
- Added a "download raw diff" link.

Test Plan: Viewed Diffusion and raw commits for SVN, Mercurial and Git repositories.

Reviewers: vrana, btrahan, jungejason

Reviewed By: vrana

CC: aran

Differential Revision: https://secure.phabricator.com/D2350

+339 -47
+1
conf/default.conf.php
··· 645 645 'image/png' => 'image/png', 646 646 'image/gif' => 'image/gif', 647 647 'text/plain' => 'text/plain; charset=utf-8', 648 + 'text/x-diff' => 'text/plain; charset=utf-8', 648 649 649 650 // ".ico" favicon files, which have mime type diversity. See: 650 651 // http://en.wikipedia.org/wiki/ICO_(file_format)#MIME_type
+8
src/__phutil_library_map__.php
··· 325 325 'DiffusionGitHistoryQuery' => 'applications/diffusion/query/history/git', 326 326 'DiffusionGitLastModifiedQuery' => 'applications/diffusion/query/lastmodified/git', 327 327 'DiffusionGitMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/git', 328 + 'DiffusionGitRawDiffQuery' => 'applications/diffusion/query/rawdiff/git', 328 329 'DiffusionGitRenameHistoryQuery' => 'applications/diffusion/query/renamehistory/git', 329 330 'DiffusionGitRequest' => 'applications/diffusion/request/git', 330 331 'DiffusionGitTagListQuery' => 'applications/diffusion/query/taglist/git', ··· 345 346 'DiffusionMercurialHistoryQuery' => 'applications/diffusion/query/history/mercurial', 346 347 'DiffusionMercurialLastModifiedQuery' => 'applications/diffusion/query/lastmodified/mercurial', 347 348 'DiffusionMercurialMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/mercurial', 349 + 'DiffusionMercurialRawDiffQuery' => 'applications/diffusion/query/rawdiff/mercurial', 348 350 'DiffusionMercurialRenameHistoryQuery' => 'applications/diffusion/query/renamehistory/mercurial', 349 351 'DiffusionMercurialRequest' => 'applications/diffusion/request/mercurial', 350 352 'DiffusionMercurialTagListQuery' => 'applications/diffusion/query/taglist/mercurial', ··· 357 359 'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/base/__tests__', 358 360 'DiffusionPathValidateController' => 'applications/diffusion/controller/pathvalidate', 359 361 'DiffusionQuery' => 'applications/diffusion/query/base', 362 + 'DiffusionRawDiffQuery' => 'applications/diffusion/query/rawdiff/base', 360 363 'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/renamehistory/base', 361 364 'DiffusionRepositoryController' => 'applications/diffusion/controller/repository', 362 365 'DiffusionRepositoryPath' => 'applications/diffusion/data/repositorypath', ··· 371 374 'DiffusionSvnHistoryQuery' => 'applications/diffusion/query/history/svn', 372 375 'DiffusionSvnLastModifiedQuery' => 'applications/diffusion/query/lastmodified/svn', 373 376 'DiffusionSvnMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/svn', 377 + 'DiffusionSvnRawDiffQuery' => 'applications/diffusion/query/rawdiff/svn', 374 378 'DiffusionSvnRenameHistoryQuery' => 'applications/diffusion/query/renamehistory/svn', 375 379 'DiffusionSvnRequest' => 'applications/diffusion/request/svn', 376 380 'DiffusionSvnTagListQuery' => 'applications/diffusion/query/taglist/svn', ··· 1301 1305 'DiffusionGitHistoryQuery' => 'DiffusionHistoryQuery', 1302 1306 'DiffusionGitLastModifiedQuery' => 'DiffusionLastModifiedQuery', 1303 1307 'DiffusionGitMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 1308 + 'DiffusionGitRawDiffQuery' => 'DiffusionRawDiffQuery', 1304 1309 'DiffusionGitRenameHistoryQuery' => 'DiffusionRenameHistoryQuery', 1305 1310 'DiffusionGitRequest' => 'DiffusionRequest', 1306 1311 'DiffusionGitTagListQuery' => 'DiffusionTagListQuery', ··· 1321 1326 'DiffusionMercurialHistoryQuery' => 'DiffusionHistoryQuery', 1322 1327 'DiffusionMercurialLastModifiedQuery' => 'DiffusionLastModifiedQuery', 1323 1328 'DiffusionMercurialMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 1329 + 'DiffusionMercurialRawDiffQuery' => 'DiffusionRawDiffQuery', 1324 1330 'DiffusionMercurialRenameHistoryQuery' => 'DiffusionRenameHistoryQuery', 1325 1331 'DiffusionMercurialRequest' => 'DiffusionRequest', 1326 1332 'DiffusionMercurialTagListQuery' => 'DiffusionTagListQuery', ··· 1328 1334 'DiffusionPathCompleteController' => 'DiffusionController', 1329 1335 'DiffusionPathQueryTestCase' => 'PhabricatorTestCase', 1330 1336 'DiffusionPathValidateController' => 'DiffusionController', 1337 + 'DiffusionRawDiffQuery' => 'DiffusionQuery', 1331 1338 'DiffusionRenameHistoryQuery' => 'DiffusionQuery', 1332 1339 'DiffusionRepositoryController' => 'DiffusionController', 1333 1340 'DiffusionSvnBrowseQuery' => 'DiffusionBrowseQuery', ··· 1339 1346 'DiffusionSvnHistoryQuery' => 'DiffusionHistoryQuery', 1340 1347 'DiffusionSvnLastModifiedQuery' => 'DiffusionLastModifiedQuery', 1341 1348 'DiffusionSvnMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 1349 + 'DiffusionSvnRawDiffQuery' => 'DiffusionRawDiffQuery', 1342 1350 'DiffusionSvnRenameHistoryQuery' => 'DiffusionRenameHistoryQuery', 1343 1351 'DiffusionSvnRequest' => 'DiffusionRequest', 1344 1352 'DiffusionSvnTagListQuery' => 'DiffusionTagListQuery',
+37 -1
src/applications/diffusion/controller/commit/DiffusionCommitController.php
··· 34 34 $request = $this->getRequest(); 35 35 $user = $request->getUser(); 36 36 37 + if ($request->getStr('diff')) { 38 + return $this->buildRawDiffResponse($drequest); 39 + } 40 + 37 41 $callsign = $drequest->getRepository()->getCallsign(); 38 42 39 43 $content = array(); ··· 676 680 private function renderHeadsupActionList( 677 681 PhabricatorRepositoryCommit $commit) { 678 682 679 - $user = $this->getRequest()->getUser(); 683 + $request = $this->getRequest(); 684 + $user = $request->getUser(); 680 685 681 686 $actions = array(); 682 687 ··· 723 728 $action->setName('Herald Transcripts'); 724 729 $action->setURI('/herald/transcript/?phid='.$commit->getPHID()); 725 730 $action->setClass('transcripts-herald'); 731 + $actions[] = $action; 732 + 733 + $action = new AphrontHeadsupActionView(); 734 + $action->setName('Download Raw Diff'); 735 + $action->setURI($request->getRequestURI()->alter('diff', true)); 736 + $action->setClass('action-download'); 726 737 $actions[] = $action; 727 738 728 739 $action_list = new AphrontHeadsupActionListView(); ··· 793 804 $request->getCommit()); 794 805 795 806 return trim($stdout, "() \n"); 807 + } 808 + 809 + private function buildRawDiffResponse(DiffusionRequest $drequest) { 810 + $raw_query = DiffusionRawDiffQuery::newFromDiffusionRequest($drequest); 811 + $raw_diff = $raw_query->loadRawDiff(); 812 + 813 + $hash = PhabricatorHash::digest($raw_diff); 814 + 815 + $file = id(new PhabricatorFile())->loadOneWhere( 816 + 'contentHash = %s LIMIT 1', 817 + $hash); 818 + if (!$file) { 819 + // We're just caching the data; this is always safe. 820 + $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); 821 + 822 + $file = PhabricatorFile::newFromFileData( 823 + $raw_diff, 824 + array( 825 + 'name' => $drequest->getCommit().'.diff', 826 + )); 827 + 828 + unset($unguarded); 829 + } 830 + 831 + return id(new AphrontRedirectResponse())->setURI($file->getBestURI()); 796 832 } 797 833 798 834 }
+5
src/applications/diffusion/controller/commit/__init__.php
··· 6 6 7 7 8 8 9 + phutil_require_module('phabricator', 'aphront/response/redirect'); 10 + phutil_require_module('phabricator', 'aphront/writeguard'); 9 11 phutil_require_module('phabricator', 'applications/audit/constants/action'); 10 12 phutil_require_module('phabricator', 'applications/audit/constants/commitstatus'); 11 13 phutil_require_module('phabricator', 'applications/audit/constants/status'); ··· 25 27 phutil_require_module('phabricator', 'applications/diffusion/query/path'); 26 28 phutil_require_module('phabricator', 'applications/diffusion/query/pathchange/base'); 27 29 phutil_require_module('phabricator', 'applications/diffusion/query/pathid/base'); 30 + phutil_require_module('phabricator', 'applications/diffusion/query/rawdiff/base'); 28 31 phutil_require_module('phabricator', 'applications/diffusion/request/base'); 29 32 phutil_require_module('phabricator', 'applications/diffusion/view/commentlist'); 30 33 phutil_require_module('phabricator', 'applications/diffusion/view/commitchangetable'); 31 34 phutil_require_module('phabricator', 'applications/diffusion/view/historytable'); 32 35 phutil_require_module('phabricator', 'applications/draft/storage/draft'); 36 + phutil_require_module('phabricator', 'applications/files/storage/file'); 33 37 phutil_require_module('phabricator', 'applications/flag/constants/color'); 34 38 phutil_require_module('phabricator', 'applications/flag/query/flag'); 35 39 phutil_require_module('phabricator', 'applications/markup/engine'); ··· 41 45 phutil_require_module('phabricator', 'infrastructure/edges/query/edge'); 42 46 phutil_require_module('phabricator', 'infrastructure/env'); 43 47 phutil_require_module('phabricator', 'infrastructure/javelin/api'); 48 + phutil_require_module('phabricator', 'infrastructure/util/hash'); 44 49 phutil_require_module('phabricator', 'storage/queryfx'); 45 50 phutil_require_module('phabricator', 'view/form/base'); 46 51 phutil_require_module('phabricator', 'view/form/control/select');
+2 -38
src/applications/diffusion/query/diff/git/DiffusionGitDiffQuery.php
··· 29 29 // TODO: This side effect is kind of skethcy. 30 30 $drequest->setCommit($effective_commit); 31 31 32 - $options = array( 33 - '-M', 34 - '-C', 35 - '--no-ext-diff', 36 - '--no-color', 37 - '--src-prefix=a/', 38 - '--dst-prefix=b/', 39 - '-U65535', 40 - ); 41 - $options = implode(' ', $options); 42 - 43 - try { 44 - list($raw_diff) = $repository->execxLocalCommand( 45 - 'diff %C %s^ %s -- %s', 46 - $options, 47 - $effective_commit, 48 - $effective_commit, 49 - $drequest->getPath()); 50 - } catch (CommandException $ex) { 51 - // Check if this is the root commit by seeing if it has parents. 52 - list($parents) = $repository->execxLocalCommand( 53 - 'log --format=%s %s --', 54 - '%P', // "parents" 55 - $effective_commit); 56 - if (!strlen(trim($parents))) { 57 - // No parents means we're looking at the root revision. Diff against 58 - // the empty tree hash instead, since there is no parent so "^" does 59 - // not work. See ArcanistGitAPI for more discussion. 60 - list($raw_diff) = $repository->execxLocalCommand( 61 - 'diff %C %s %s -- %s', 62 - $options, 63 - ArcanistGitAPI::GIT_MAGIC_ROOT_COMMIT, 64 - $effective_commit, 65 - $drequest->getPath()); 66 - } else { 67 - throw $ex; 68 - } 69 - } 32 + $raw_query = DiffusionRawDiffQuery::newFromDiffusionRequest($drequest); 33 + $raw_diff = $raw_query->loadRawDiff(); 70 34 71 35 if (!$raw_diff) { 72 36 return null;
+1 -1
src/applications/diffusion/query/diff/git/__init__.php
··· 7 7 8 8 9 9 phutil_require_module('arcanist', 'parser/diff'); 10 - phutil_require_module('arcanist', 'repository/api/git'); 11 10 12 11 phutil_require_module('phabricator', 'applications/differential/storage/diff'); 13 12 phutil_require_module('phabricator', 'applications/diffusion/query/diff/base'); 13 + phutil_require_module('phabricator', 'applications/diffusion/query/rawdiff/base'); 14 14 15 15 16 16 phutil_require_source('DiffusionGitDiffQuery.php');
+2 -7
src/applications/diffusion/query/diff/mercurial/DiffusionMercurialDiffQuery.php
··· 29 29 // TODO: This side effect is kind of skethcy. 30 30 $drequest->setCommit($effective_commit); 31 31 32 - $path = $drequest->getPath(); 33 - 34 - list($raw_diff) = $repository->execxLocalCommand( 35 - 'diff -U %d --git --change %s -- %s', 36 - 65535, 37 - $effective_commit, 38 - $path); 32 + $query = DiffusionRawDiffQuery::newFromDiffusionRequest($drequest); 33 + $raw_diff = $query->loadRawDiff(); 39 34 40 35 $parser = new ArcanistDiffParser(); 41 36
+1
src/applications/diffusion/query/diff/mercurial/__init__.php
··· 10 10 11 11 phutil_require_module('phabricator', 'applications/differential/storage/diff'); 12 12 phutil_require_module('phabricator', 'applications/diffusion/query/diff/base'); 13 + phutil_require_module('phabricator', 'applications/diffusion/query/rawdiff/base'); 13 14 14 15 15 16 phutil_require_source('DiffusionMercurialDiffQuery.php');
+52
src/applications/diffusion/query/rawdiff/base/DiffusionRawDiffQuery.php
··· 1 + <?php 2 + 3 + /* 4 + * Copyright 2012 Facebook, Inc. 5 + * 6 + * Licensed under the Apache License, Version 2.0 (the "License"); 7 + * you may not use this file except in compliance with the License. 8 + * You may obtain a copy of the License at 9 + * 10 + * http://www.apache.org/licenses/LICENSE-2.0 11 + * 12 + * Unless required by applicable law or agreed to in writing, software 13 + * distributed under the License is distributed on an "AS IS" BASIS, 14 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 + * See the License for the specific language governing permissions and 16 + * limitations under the License. 17 + */ 18 + 19 + abstract class DiffusionRawDiffQuery extends DiffusionQuery { 20 + 21 + private $request; 22 + private $timeout; 23 + private $linesOfContext = 65535; 24 + 25 + final public static function newFromDiffusionRequest( 26 + DiffusionRequest $request) { 27 + return parent::newQueryObject(__CLASS__, $request); 28 + } 29 + 30 + final public function loadRawDiff() { 31 + return $this->executeQuery(); 32 + } 33 + 34 + final public function setTimeout($timeout) { 35 + $this->timeout = $timeout; 36 + return $this; 37 + } 38 + 39 + final public function getTimeout() { 40 + return $this->timeout; 41 + } 42 + 43 + final public function setLinesOfContext($lines_of_context) { 44 + $this->linesOfContext = $lines_of_context; 45 + return $this; 46 + } 47 + 48 + final public function getLinesOfContext() { 49 + return $this->linesOfContext; 50 + } 51 + 52 + }
+12
src/applications/diffusion/query/rawdiff/base/__init__.php
··· 1 + <?php 2 + /** 3 + * This file is automatically generated. Lint this module to rebuild it. 4 + * @generated 5 + */ 6 + 7 + 8 + 9 + phutil_require_module('phabricator', 'applications/diffusion/query/base'); 10 + 11 + 12 + phutil_require_source('DiffusionRawDiffQuery.php');
+85
src/applications/diffusion/query/rawdiff/git/DiffusionGitRawDiffQuery.php
··· 1 + <?php 2 + 3 + /* 4 + * Copyright 2012 Facebook, Inc. 5 + * 6 + * Licensed under the Apache License, Version 2.0 (the "License"); 7 + * you may not use this file except in compliance with the License. 8 + * You may obtain a copy of the License at 9 + * 10 + * http://www.apache.org/licenses/LICENSE-2.0 11 + * 12 + * Unless required by applicable law or agreed to in writing, software 13 + * distributed under the License is distributed on an "AS IS" BASIS, 14 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 + * See the License for the specific language governing permissions and 16 + * limitations under the License. 17 + */ 18 + 19 + final class DiffusionGitRawDiffQuery extends DiffusionRawDiffQuery { 20 + 21 + protected function executeQuery() { 22 + $drequest = $this->getRequest(); 23 + $repository = $drequest->getRepository(); 24 + 25 + $commit = $drequest->getCommit(); 26 + 27 + $options = array( 28 + '-M', 29 + '-C', 30 + '--no-ext-diff', 31 + '--no-color', 32 + '--src-prefix=a/', 33 + '--dst-prefix=b/', 34 + '-U'.(int)$this->getLinesOfContext(), 35 + ); 36 + $options = implode(' ', $options); 37 + 38 + // If there's no path, get the entire raw diff. 39 + $path = nonempty($drequest->getPath(), '.'); 40 + 41 + $future = $repository->getLocalCommandFuture( 42 + "diff %C %s^ %s -- %s", 43 + $options, 44 + $commit, 45 + $commit, 46 + $path); 47 + 48 + if ($this->getTimeout()) { 49 + $future->setTimeout($this->getTimeout()); 50 + } 51 + 52 + try { 53 + list($raw_diff) = $future->resolvex(); 54 + } catch (CommandException $ex) { 55 + // Check if this is the root commit by seeing if it has parents. 56 + list($parents) = $repository->execxLocalCommand( 57 + 'log --format=%s %s --', 58 + '%P', // "parents" 59 + $effective_commit); 60 + 61 + if (strlen(trim($parents))) { 62 + throw $ex; 63 + } 64 + 65 + // No parents means we're looking at the root revision. Diff against 66 + // the empty tree hash instead, since there is no parent so "^" does 67 + // not work. See ArcanistGitAPI for more discussion. 68 + $future = $repository->getLocalCommandFuture( 69 + 'diff %C %s %s -- %s', 70 + $options, 71 + ArcanistGitAPI::GIT_MAGIC_ROOT_COMMIT, 72 + $commit, 73 + $drequest->getPath()); 74 + 75 + if ($this->getTimeout()) { 76 + $future->setTimeout($this->getTimeout()); 77 + } 78 + 79 + list($raw_diff) = $future->resolvex(); 80 + } 81 + 82 + return $raw_diff; 83 + } 84 + 85 + }
+16
src/applications/diffusion/query/rawdiff/git/__init__.php
··· 1 + <?php 2 + /** 3 + * This file is automatically generated. Lint this module to rebuild it. 4 + * @generated 5 + */ 6 + 7 + 8 + 9 + phutil_require_module('arcanist', 'repository/api/git'); 10 + 11 + phutil_require_module('phabricator', 'applications/diffusion/query/rawdiff/base'); 12 + 13 + phutil_require_module('phutil', 'utils'); 14 + 15 + 16 + phutil_require_source('DiffusionGitRawDiffQuery.php');
+45
src/applications/diffusion/query/rawdiff/mercurial/DiffusionMercurialRawDiffQuery.php
··· 1 + <?php 2 + 3 + /* 4 + * Copyright 2012 Facebook, Inc. 5 + * 6 + * Licensed under the Apache License, Version 2.0 (the "License"); 7 + * you may not use this file except in compliance with the License. 8 + * You may obtain a copy of the License at 9 + * 10 + * http://www.apache.org/licenses/LICENSE-2.0 11 + * 12 + * Unless required by applicable law or agreed to in writing, software 13 + * distributed under the License is distributed on an "AS IS" BASIS, 14 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 + * See the License for the specific language governing permissions and 16 + * limitations under the License. 17 + */ 18 + 19 + final class DiffusionMercurialRawDiffQuery extends DiffusionRawDiffQuery { 20 + 21 + protected function executeQuery() { 22 + $drequest = $this->getRequest(); 23 + $repository = $drequest->getRepository(); 24 + 25 + $commit = $drequest->getCommit(); 26 + 27 + // If there's no path, get the entire raw diff. 28 + $path = nonempty($drequest->getPath(), '.'); 29 + 30 + $future = $repository->getLocalCommandFuture( 31 + 'diff -U %d --git --change %s -- %s', 32 + $this->getLinesOfContext(), 33 + $commit, 34 + $path); 35 + 36 + if ($this->getTimeout()) { 37 + $future->setTimeout($this->getTimeout()); 38 + } 39 + 40 + list($raw_diff) = $future->resolvex(); 41 + 42 + return $raw_diff; 43 + } 44 + 45 + }
+14
src/applications/diffusion/query/rawdiff/mercurial/__init__.php
··· 1 + <?php 2 + /** 3 + * This file is automatically generated. Lint this module to rebuild it. 4 + * @generated 5 + */ 6 + 7 + 8 + 9 + phutil_require_module('phabricator', 'applications/diffusion/query/rawdiff/base'); 10 + 11 + phutil_require_module('phutil', 'utils'); 12 + 13 + 14 + phutil_require_source('DiffusionMercurialRawDiffQuery.php');
+42
src/applications/diffusion/query/rawdiff/svn/DiffusionSvnRawDiffQuery.php
··· 1 + <?php 2 + 3 + /* 4 + * Copyright 2012 Facebook, Inc. 5 + * 6 + * Licensed under the Apache License, Version 2.0 (the "License"); 7 + * you may not use this file except in compliance with the License. 8 + * You may obtain a copy of the License at 9 + * 10 + * http://www.apache.org/licenses/LICENSE-2.0 11 + * 12 + * Unless required by applicable law or agreed to in writing, software 13 + * distributed under the License is distributed on an "AS IS" BASIS, 14 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 + * See the License for the specific language governing permissions and 16 + * limitations under the License. 17 + */ 18 + 19 + final class DiffusionSvnRawDiffQuery extends DiffusionRawDiffQuery { 20 + 21 + protected function executeQuery() { 22 + $drequest = $this->getRequest(); 23 + $repository = $drequest->getRepository(); 24 + 25 + $commit = $drequest->getCommit(); 26 + 27 + $future = $repository->getRemoteCommandFuture( 28 + 'diff --diff-cmd diff -x -U%d -c %d %s%s@', 29 + $this->getLinesOfContext(), 30 + $commit, 31 + $repository->getRemoteURI(), 32 + $drequest->getPath()); 33 + 34 + if ($this->getTimeout()) { 35 + $future->setTimeout($this->getTimeout()); 36 + } 37 + 38 + list($raw_diff) = $future->resolvex(); 39 + return $raw_diff; 40 + } 41 + 42 + }
+12
src/applications/diffusion/query/rawdiff/svn/__init__.php
··· 1 + <?php 2 + /** 3 + * This file is automatically generated. Lint this module to rebuild it. 4 + * @generated 5 + */ 6 + 7 + 8 + 9 + phutil_require_module('phabricator', 'applications/diffusion/query/rawdiff/base'); 10 + 11 + 12 + phutil_require_source('DiffusionSvnRawDiffQuery.php');
+4
webroot/rsrc/css/aphront/headsup-action-list-view.css
··· 54 54 background-image: url(/rsrc/image/icon/tango/upload.png); 55 55 } 56 56 57 + .aphront-headsup-action-list .action-download { 58 + background-image: url(/rsrc/image/icon/tango/go-down.png); 59 + } 60 + 57 61 .aphront-headsup-action-list .transcripts-metamta { 58 62 background-image: url(/rsrc/image/icon/tango/log.png); 59 63 }
webroot/rsrc/image/icon/tango/go-down.png

This is a binary file and will not be displayed.