# coding: utf-8
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Samples patches to test patch.py."""


class RAW(object):
  PATCH = (
      'Index: chrome/file.cc\n'
      '===================================================================\n'
      '--- chrome/file.cc\t(revision 74690)\n'
      '+++ chrome/file.cc\t(working copy)\n'
      '@@ -3,6 +3,7 @@ bb\n'
      ' ccc\n'
      ' dd\n'
      ' e\n'
      '+FOO!\n'
      ' ff\n'
      ' ggg\n'
      ' hh\n')

  NEW = (
      '--- /dev/null\n'
      '+++ foo\n'
      '@@ -0,0 +1 @@\n'
      '+bar\n')

  NEW_NOT_NULL = (
      '--- file_a\n'
      '+++ file_a\n'
      '@@ -0,0 +1 @@\n'
      '+foo\n')

  MINIMAL_NEW = (
      '--- /dev/null\t2\n'
      '+++ chrome/file.cc\tfoo\n')

  MINIMAL = (
      '--- file_a\n'
      '+++ file_a\n')

  MINIMAL_RENAME = (
      '--- file_a\n'
      '+++ file_b\n')

  DELETE = (
      '--- tools/clang_check/README.chromium\n'
      '+++ /dev/null\n'
      '@@ -1,1 +0,0 @@\n'
      '-bar\n')

  MINIMAL_DELETE = (
      '--- chrome/file.cc\tbar\n'
      '+++ /dev/null\tfoo\n')

  DELETE2 = (
      'Index: browser/extensions/extension_sidebar_api.cc\n'
      '===================================================================\n'
      '--- browser/extensions/extension_sidebar_api.cc\t(revision 116830)\n'
      '+++ browser/extensions/extension_sidebar_api.cc\t(working copy)\n'
      '@@ -1,19 +0,0 @@\n'
      '-// Copyright (c) 2011 The Chromium Authors. All rights reserved.\n'
      '-// Use of this source code is governed by a BSD-style license that\n'
      '-// found in the LICENSE file.\n'
      '-\n'
      '-#include "base/command_line.h"\n'
      '-#include "chrome/browser/extensions/extension_apitest.h"\n'
      '-#include "chrome/common/chrome_switches.h"\n'
      '-\n'
      '-class SidebarApiTest : public ExtensionApiTest {\n'
      '- public:\n'
      '-  void SetUpCommandLine(CommandLine* command_line) {\n'
      '-    ExtensionApiTest::SetUpCommandLine(command_line);\n'
      '-    command_line->AppendSwitch(switches::Bleh);\n'
      '-  }\n'
      '-};\n'
      '-\n'
      '-IN_PROC_BROWSER_TEST_F(SidebarApiTest, Sidebar) {\n'
      '-  ASSERT_TRUE(RunExtensionTest("sidebar")) << message_;\n'
      '-}\n')

  # http://codereview.chromium.org/api/7530007/5001
  # http://codereview.chromium.org/download/issue7530007_5001_4011.diff
  CRAP_ONLY = (
      'Index: scripts/master/factory/skia/__init__.py\n'
      '===================================================================\n')

  TWO_HUNKS = (
      'Index: chrome/app/generated_resources.grd\n'
      '===================================================================\n'
      '--- chrome/app/generated_resources.grd\t(revision 116830)\n'
      '+++ chrome/app/generated_resources.grd\t(working copy)\n'
      '@@ -4169,9 +4169,6 @@\n'
      '       <message name="IDS_EXTENSION_LOAD_OPTIONS_PAGE_FAILED" desc="">\n'
      '   Could not load options page \'<ph name="OPTIONS_PAGE">$1<ex....\n'
      ' </message>\n'
      '-      <message name="IDS_EXTENSION_LOAD_SIDEBAR_PAGE_FAILED" desc="">\n'
      '-        Could not load sidebar page \'<ph name="SIDEBAR_PAGE">$1<e...\n'
      '-      </message>\n'
      '       <if expr="is_win">\n'
      '         <message name="IDS_EXTENSION_UNPACK_FAILED" desc="On wind...\n'
      '           Can not unpack extension.  To safely unpack an extensio...\n'
      '@@ -5593,9 +5590,6 @@\n'
      '       <message name="IDS_ACCNAME_WEB_CONTENTS" desc="The acces...\n'
      '         Web Contents\n'
      '       </message>\n'
      '-      <message name="IDS_ACCNAME_SIDE_BAR" desc="The acces...\n'
      '-        Sidebar\n'
      '-      </message>\n'
      ' \n'
      '       <!-- Browser Hung Plugin Detector -->\n'
      '       <message name="IDS_UNKNOWN_PLUGIN_NAME" ...\n')

  # http://codereview.chromium.org/download/issue9091003_9005_8009.diff
  DIFFERENT = (
      'Index: master/unittests/data/processes-summary.dat\n'
      '===================================================================\n'
      '--- master/unittests/data/processes-summary.dat\t(revision 116240)\n'
      '+++ master/unittests/data/processes-summary.dat\t(working copy)\n'
      '@@ -1 +1 @@\n'
      '-{"traces": {"1t_proc": ["2.0", "0.0"], "1t_proc_ref": ["1.0", ...\n'
      '+{"traces": {"1t_proc": ["2.0", "0.0"], "1t_proc_ref": ["1.0", ...\n')

  RENAME_UTF8 = (
      u'--- file_à\n'
      u'+++ filé_b\n'
      u'@@ -3,6 +3,7 @@ bb\n'
      u' ccc\n'
      u' ddé\n'
      u' e\n'
      u'+FÔÒ!\n'
      u' ff\n'
      u' ggg\n'
      u' hh\n').encode('utf-8')


class GIT(object):
  """Sample patches generated by git diff."""
  PATCH = (
      'diff --git a/chrome/file.cc b/chrome/file.cc\n'
      'index 0e4de76..8320059 100644\n'
      '--- a/chrome/file.cc\n'
      '+++ b/chrome/file.cc\n'
      '@@ -3,6 +3,7 @@ bb\n'
      ' ccc\n'
      ' dd\n'
      ' e\n'
      '+FOO!\n'
      ' ff\n'
      ' ggg\n'
      ' hh\n')

  # http://codereview.chromium.org/download/issue10868039_12001_10003.diff
  PATCH_SHORT_HUNK_HEADER = (
      'Index: chrome/browser/api/OWNERS\n'
      'diff --git a/chrome/browser/api/OWNERS b/chrome/browser/api/OWNERS\n'
      '--- a/chrome/browser/api/OWNERS\n'
      '+++ b/chrome/browser/api/OWNERS\n'
      '@@ -1 +1,2 @@\n'
      '+erikwright@chromium.org\n'
      ' joi@chromium.org\n')

  # http://codereview.chromium.org/download/issue6368055_22_29.diff
  DELETE = (
      'Index: tools/clang_check/README.chromium\n'
      'diff --git a/tools/clang_check/README.chromium '
          'b/tools/clang_check/README.chromium\n'
      'deleted file mode 100644\n'
      'index fcaa7e0e94bb604a026c4f478fecb1c5796f5413..'
          '0000000000000000000000000000000000000000\n'
      '--- a/tools/clang_check/README.chromium\n'
      '+++ /dev/null\n'
      '@@ -1,9 +0,0 @@\n'
      '-These are terrible, terrible hacks.\n'
      '-\n'
      '-They are meant \n'
      '-AND doing the normal \n'
      '-run during normal \n'
      '-build system to do a syntax check.\n'
      '-\n'
      '-Also see\n'
      '\n')

  # http://codereview.chromium.org/download/issue8508015_6001_7001.diff
  DELETE_EMPTY = (
      'Index: tests/__init__.py\n'
      'diff --git a/tests/__init__.py b/tests/__init__.py\n'
      'deleted file mode 100644\n'
      'index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..'
          '0000000000000000000000000000000000000000\n')

  # http://codereview.chromium.org/download/issue6250123_3013_6010.diff
  RENAME_PARTIAL = (
      'Index: chromeos/views/webui_menu_widget.h\n'
      'diff --git a/chromeos/views/DOMui_menu_widget.h '
          'b/chromeos/views/webui_menu_widget.h\n'
      'similarity index 79%\n'
      'rename from chromeos/views/DOMui_menu_widget.h\n'
      'rename to chromeos/views/webui_menu_widget.h\n'
      'index 095d4c474fd9718f5aebfa41a1ccb2d951356d41..'
          '157925075434b590e8acaaf605a64f24978ba08b 100644\n'
      '--- a/chromeos/views/DOMui_menu_widget.h\n'
      '+++ b/chromeos/views/webui_menu_widget.h\n'
      '@@ -1,9 +1,9 @@\n'
      '-// Copyright (c) 2010\n'
      '+// Copyright (c) 2011\n'
      ' // Use of this source code\n'
      ' // found in the LICENSE file.\n'
      ' \n'
      '-#ifndef DOM\n'
      '-#define DOM\n'
      '+#ifndef WEB\n'
      '+#define WEB\n'
      ' #pragma once\n'
      ' \n'
      ' #include <string>\n')

  # http://codereview.chromium.org/download/issue6287022_3001_4010.diff
  RENAME = (
      'Index: tools/run_local_server.sh\n'
      'diff --git a/tools/run_local_server.PY b/tools/run_local_server.sh\n'
      'similarity index 100%\n'
      'rename from tools/run_local_server.PY\n'
      'rename to tools/run_local_server.sh\n')

  COPY = (
      'diff --git a/PRESUBMIT.py b/pp\n'
      'similarity index 100%\n'
      'copy from PRESUBMIT.py\n'
      'copy to pp\n')

  COPY_PARTIAL = (
      'diff --git a/wtf b/wtf2\n'
      'similarity index 98%\n'
      'copy from wtf\n'
      'copy to wtf2\n'
      'index 79fbaf3..3560689 100755\n'
      '--- a/wtf\n'
      '+++ b/wtf2\n'
      '@@ -1,4 +1,4 @@\n'
      '-#!/usr/bin/env python\n'
      '+#!/usr/bin/env python1.3\n'
      ' # Copyright (c) 2010 The Chromium Authors. All rights reserved.\n'
      ' # blah blah blah as\n'
      ' # found in the LICENSE file.\n')

  NEW = (
      'diff --git a/foo b/foo\n'
      'new file mode 100644\n'
      'index 0000000..5716ca5\n'
      '--- /dev/null\n'
      '+++ b/foo\n'
      '@@ -0,0 +1 @@\n'
      '+bar\n')

  NEW_EXE = (
      'diff --git a/natsort_test.py b/natsort_test.py\n'
      'new file mode 100755\n'
      '--- /dev/null\n'
      '+++ b/natsort_test.py\n'
      '@@ -0,0 +1,1 @@\n'
      '+#!/usr/bin/env python\n')

  # To make sure the subdirectory was created as needed.
  NEW_SUBDIR = (
      'diff --git a/new_dir/subdir/new_file b/new_dir/subdir/new_file\n'
      'new file mode 100644\n'
      '--- /dev/null\n'
      '+++ b/new_dir/subdir/new_file\n'
      '@@ -0,0 +1,2 @@\n'
      '+A new file\n'
      '+should exist.\n')

  NEW_MODE = (
      'diff --git a/natsort_test.py b/natsort_test.py\n'
      'new file mode 100644\n'
      '--- /dev/null\n'
      '+++ b/natsort_test.py\n'
      '@@ -0,0 +1,1 @@\n'
      '+#!/usr/bin/env python\n')

  MODE_EXE = (
      'diff --git a/git_cl/git-cl b/git_cl/git-cl\n'
      'old mode 100644\n'
      'new mode 100755\n')

  MODE_EXE_JUNK = (
      'Index: Junk\n'
      'diff --git a/git_cl/git-cl b/git_cl/git-cl\n'
      'old mode 100644\n'
      'new mode 100755\n')

  NEW_NOT_EXECUTABLE = (
      'diff --git a/build/android/ant/create.js b/build/android/ant/create.js\n'
      'new file mode 100644\n'
      'index 0000000000000000000..542a89e978feada38dd\n'
      '--- /dev/null\n'
      '+++ b/build/android/ant/create.js\n'
      '@@ -0,0 +1,1 @@\n'
      '+// Copyright (c) 2012 The Chromium Authors. All rights reserved.\n'
  )

  FOUR_HUNKS = (
      'Index: presubmit_support.py\n'
      'diff --git a/presubmit_support.py b/presubmit_support.py\n'
      'index 52416d3f..d56512f2 100755\n'
      '--- a/presubmit_support.py\n'
      '+++ b/presubmit_support.py\n'
      '@@ -558,6 +558,7 @@ class SvnAffectedFile(AffectedFile):\n'
      '     AffectedFile.__init__(self, *args, **kwargs)\n'
      '     self._server_path = None\n'
      '     self._is_text_file = None\n'
      '+    self._diff = None\n'
      ' \n'
      '   def ServerPath(self):\n'
      '     if self._server_path is None:\n'
      '@@ -598,8 +599,10 @@ class SvnAffectedFile(AffectedFile):\n'
      '     return self._is_text_file\n'
      ' \n'
      '   def GenerateScmDiff(self):\n'
      '-    return scm.SVN.GenerateDiff(\n'
      '-        [self.LocalPath()], self._local_root, False, None)\n'
      '+    if self._diff is None:\n'
      '+      self._diff = scm.SVN.GenerateDiff(\n'
      '+          [self.LocalPath()], self._local_root, False, None)\n'
      '+    return self._diff\n'
      ' \n'
      ' \n'
      ' class GitAffectedFile(AffectedFile):\n'
      '@@ -611,6 +614,7 @@ class GitAffectedFile(AffectedFile):\n'
      '     AffectedFile.__init__(self, *args, **kwargs)\n'
      '     self._server_path = None\n'
      '     self._is_text_file = None\n'
      '+    self._diff = None\n'
      ' \n'
      '   def ServerPath(self):\n'
      '     if self._server_path is None:\n'
      '@@ -645,7 +649,10 @@ class GitAffectedFile(AffectedFile):\n'
      '     return self._is_text_file\n'
      ' \n'
      '   def GenerateScmDiff(self):\n'
      '-    return scm.GIT.GenerateDiff(self._local_root, files=[self.Lo...\n'
      '+    if self._diff is None:\n'
      '+      self._diff = scm.GIT.GenerateDiff(\n'
      '+          self._local_root, files=[self.LocalPath(),])\n'
      '+    return self._diff\n'
      ' \n'
      ' \n'
      ' class Change(object):\n')
