Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Side by Side Diff: gclient.py

Issue 2129005: Goes further down the rabbit hole. (Closed)
Patch Set: Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tests/gclient_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """A wrapper script to manage a set of client modules in different SCM. 6 """A wrapper script to manage a set of client modules in different SCM.
7 7
8 This script is intended to be used to help basic management of client 8 This script is intended to be used to help basic management of client
9 program sources residing in one or more Subversion modules and Git 9 program sources residing in one or more Subversion modules and Git
10 repositories, along with other modules it depends on, also in Subversion or Git, 10 repositories, along with other modules it depends on, also in Subversion or Git,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 it will be removed from the list and the list will be extended 48 it will be removed from the list and the list will be extended
49 by the list of matching files. 49 by the list of matching files.
50 50
51 Example: 51 Example:
52 hooks = [ 52 hooks = [
53 { "pattern": "\\.(gif|jpe?g|pr0n|png)$", 53 { "pattern": "\\.(gif|jpe?g|pr0n|png)$",
54 "action": ["python", "image_indexer.py", "--all"]}, 54 "action": ["python", "image_indexer.py", "--all"]},
55 ] 55 ]
56 """ 56 """
57 57
58 __version__ = "0.3.6" 58 __version__ = "0.3.7"
59 59
60 import errno 60 import errno
61 import logging 61 import logging
62 import optparse 62 import optparse
63 import os 63 import os
64 import pprint 64 import pprint
65 import re 65 import re
66 import sys 66 import sys
67 import urlparse 67 import urlparse
68 import urllib 68 import urllib
69 69
70 import breakpad 70 import breakpad
71 71
72 import gclient_scm 72 import gclient_scm
73 import gclient_utils 73 import gclient_utils
74 from third_party.repo.progress import Progress 74 from third_party.repo.progress import Progress
75 75
76 # default help text 76 # default help text
77 DEFAULT_USAGE_TEXT = ( 77 DEFAULT_USAGE_TEXT = (
78 """usage: %prog <subcommand> [options] [--] [SCM options/args...] 78 """%prog <subcommand> [options] [--] [SCM options/args...]
79 a wrapper for managing a set of svn client modules and/or git repositories. 79 a wrapper for managing a set of svn client modules and/or git repositories.
80 Version """ + __version__ + """ 80 Version """ + __version__ + """
81 81
82 subcommands:
83 cleanup
84 config
85 diff
86 export
87 pack
88 revert
89 status
90 sync
91 update
92 runhooks
93 revinfo
94
95 Options and extra arguments can be passed to invoked SCM commands by 82 Options and extra arguments can be passed to invoked SCM commands by
96 appending them to the command line. Note that if the first such 83 appending them to the command line. Note that if the first such
97 appended option starts with a dash (-) then the options must be 84 appended option starts with a dash (-) then the options must be
98 preceded by -- to distinguish them from gclient options. 85 preceded by -- to distinguish them from gclient options.
99 86
100 For additional help on a subcommand or examples of usage, try 87 For additional help on a subcommand or examples of usage, try
101 %prog help <subcommand> 88 %prog help <subcommand>
102 %prog help files 89 %prog help files
103 """) 90 """)
104 91
(...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 if self._options.snapshot: 809 if self._options.snapshot:
823 config = self.DEFAULT_SNAPSHOT_FILE_TEXT % {'solution_list': new_gclient} 810 config = self.DEFAULT_SNAPSHOT_FILE_TEXT % {'solution_list': new_gclient}
824 snapclient = GClient(self._root_dir, self._options) 811 snapclient = GClient(self._root_dir, self._options)
825 snapclient.SetConfig(config) 812 snapclient.SetConfig(config)
826 print(snapclient._config_content) 813 print(snapclient._config_content)
827 814
828 815
829 ## gclient commands. 816 ## gclient commands.
830 817
831 818
832 def CMDcleanup(options, args): 819 def CMDcleanup(parser, options, args):
833 """Clean up all working copies, using 'svn cleanup' for each module. 820 """Clean up all working copies, using 'svn cleanup' for each module.
821
834 Additional options and args may be passed to 'svn cleanup'. 822 Additional options and args may be passed to 'svn cleanup'.
835 823
836 usage: cleanup [options] [--] [svn cleanup args/options] 824 usage: cleanup [options] [--] [svn cleanup args/options]
837 825
838 Valid options: 826 Valid options:
839 --verbose : output additional diagnostics 827 --verbose : output additional diagnostics
840 """ 828 """
841 client = GClient.LoadCurrentConfig(options) 829 client = GClient.LoadCurrentConfig(options)
842 if not client: 830 if not client:
843 raise gclient_utils.Error("client not configured; see 'gclient config'") 831 raise gclient_utils.Error("client not configured; see 'gclient config'")
844 if options.verbose: 832 if options.verbose:
845 # Print out the .gclient file. This is longer than if we just printed the 833 # Print out the .gclient file. This is longer than if we just printed the
846 # client dict, but more legible, and it might contain helpful comments. 834 # client dict, but more legible, and it might contain helpful comments.
847 print(client.ConfigContent()) 835 print(client.ConfigContent())
848 return client.RunOnDeps('cleanup', args) 836 return client.RunOnDeps('cleanup', args)
849 837
850 838
851 def CMDconfig(options, args): 839 def CMDconfig(parser, options, args):
852 """Create a .gclient file in the current directory; this 840 """Create a .gclient file in the current directory.
853 specifies the configuration for further commands. After update/sync, 841
842 This specifies the configuration for further commands. After update/sync,
854 top-level DEPS files in each module are read to determine dependent 843 top-level DEPS files in each module are read to determine dependent
855 modules to operate on as well. If optional [url] parameter is 844 modules to operate on as well. If optional [url] parameter is
856 provided, then configuration is read from a specified Subversion server 845 provided, then configuration is read from a specified Subversion server
857 URL. Otherwise, a --spec option must be provided. A --name option overrides 846 URL. Otherwise, a --spec option must be provided. A --name option overrides
858 the default name for the solutions. 847 the default name for the solutions.
859 848
860 usage: config [option | url] [safesync url] 849 usage: config [option | url] [safesync url]
861 850
862 Valid options: 851 Valid options:
863 --name path : alternate relative path for the solution 852 --name path : alternate relative path for the solution
(...skipping 26 matching lines...) Expand all
890 # specify an alternate relpath for the given URL. 879 # specify an alternate relpath for the given URL.
891 name = options.name 880 name = options.name
892 safesync_url = "" 881 safesync_url = ""
893 if len(args) > 1: 882 if len(args) > 1:
894 safesync_url = args[1] 883 safesync_url = args[1]
895 client.SetDefaultConfig(name, base_url, safesync_url) 884 client.SetDefaultConfig(name, base_url, safesync_url)
896 client.SaveConfig() 885 client.SaveConfig()
897 return 0 886 return 0
898 887
899 888
900 def CMDexport(options, args): 889 def CMDexport(parser, options, args):
901 """Wrapper for svn export for all managed directories 890 """Wrapper for svn export for all managed directories."""
902 """
903 if len(args) != 1: 891 if len(args) != 1:
904 raise gclient_utils.Error("Need directory name") 892 raise gclient_utils.Error("Need directory name")
905 client = GClient.LoadCurrentConfig(options) 893 client = GClient.LoadCurrentConfig(options)
906 894
907 if not client: 895 if not client:
908 raise gclient_utils.Error("client not configured; see 'gclient config'") 896 raise gclient_utils.Error("client not configured; see 'gclient config'")
909 897
910 if options.verbose: 898 if options.verbose:
911 # Print out the .gclient file. This is longer than if we just printed the 899 # Print out the .gclient file. This is longer than if we just printed the
912 # client dict, but more legible, and it might contain helpful comments. 900 # client dict, but more legible, and it might contain helpful comments.
913 print(client.ConfigContent()) 901 print(client.ConfigContent())
914 return client.RunOnDeps('export', args) 902 return client.RunOnDeps('export', args)
915 903
916 904
917 def CMDhelp(options, args): 905 def CMDpack(parser, options, args):
918 """Describe the usage of this program or its subcommands. 906 """Generate a patch which can be applied at the root of the tree.
919 907
920 usage: help [options] [subcommand]
921
922 Valid options:
923 --verbose : output additional diagnostics
924 """
925 __pychecker__ = 'unusednames=options'
926 module = sys.modules[__name__]
927 commands = [x[3:] for x in dir(module) if x.startswith('CMD')]
928 if len(args) == 1 and args[0] in commands:
929 print getattr(module, 'CMD' + args[0]).__doc__
930 else:
931 raise gclient_utils.Error("unknown subcommand '%s'; see 'gclient help'" %
932 args[0])
933 return 0
934
935
936 def CMDpack(options, args):
937 """Generate a patch which can be applied at the root of the tree.
938 Internally, runs 'svn diff' on each checked out module and 908 Internally, runs 'svn diff' on each checked out module and
939 dependencies, and performs minimal postprocessing of the output. The 909 dependencies, and performs minimal postprocessing of the output. The
940 resulting patch is printed to stdout and can be applied to a freshly 910 resulting patch is printed to stdout and can be applied to a freshly
941 checked out tree via 'patch -p0 < patchfile'. Additional args and 911 checked out tree via 'patch -p0 < patchfile'. Additional args and
942 options to 'svn diff' can be passed after gclient options. 912 options to 'svn diff' can be passed after gclient options.
943 913
944 usage: pack [options] [--] [svn args/options] 914 usage: pack [options] [--] [svn args/options]
945 915
946 Valid options: 916 Valid options:
947 --verbose : output additional diagnostics 917 --verbose : output additional diagnostics
(...skipping 11 matching lines...) Expand all
959 client = GClient.LoadCurrentConfig(options) 929 client = GClient.LoadCurrentConfig(options)
960 if not client: 930 if not client:
961 raise gclient_utils.Error("client not configured; see 'gclient config'") 931 raise gclient_utils.Error("client not configured; see 'gclient config'")
962 if options.verbose: 932 if options.verbose:
963 # Print out the .gclient file. This is longer than if we just printed the 933 # Print out the .gclient file. This is longer than if we just printed the
964 # client dict, but more legible, and it might contain helpful comments. 934 # client dict, but more legible, and it might contain helpful comments.
965 print(client.ConfigContent()) 935 print(client.ConfigContent())
966 return client.RunOnDeps('pack', args) 936 return client.RunOnDeps('pack', args)
967 937
968 938
969 def CMDstatus(options, args): 939 def CMDstatus(parser, options, args):
970 """Show the status of client and dependent modules, using 'svn diff' 940 """Show the modification status of for every dependencies.
971 for each module. Additional options and args may be passed to 'svn diff'. 941
942 Additional options and args may be passed to 'svn status'.
972 943
973 usage: status [options] [--] [svn diff args/options] 944 usage: status [options] [--] [svn diff args/options]
974 945
975 Valid options: 946 Valid options:
976 --verbose : output additional diagnostics 947 --verbose : output additional diagnostics
977 --nohooks : don't run the hooks after the update is complete 948 --nohooks : don't run the hooks after the update is complete
978 """ 949 """
979 client = GClient.LoadCurrentConfig(options) 950 client = GClient.LoadCurrentConfig(options)
980 if not client: 951 if not client:
981 raise gclient_utils.Error("client not configured; see 'gclient config'") 952 raise gclient_utils.Error("client not configured; see 'gclient config'")
982 if options.verbose: 953 if options.verbose:
983 # Print out the .gclient file. This is longer than if we just printed the 954 # Print out the .gclient file. This is longer than if we just printed the
984 # client dict, but more legible, and it might contain helpful comments. 955 # client dict, but more legible, and it might contain helpful comments.
985 print(client.ConfigContent()) 956 print(client.ConfigContent())
986 return client.RunOnDeps('status', args) 957 return client.RunOnDeps('status', args)
987 958
988 959
989 def CMDsync(options, args): 960 def CMDsync(parser, options, args):
990 """Perform a checkout/update of the modules specified by the gclient 961 """Checkout/update the modules specified by the gclient configuration.
991 configuration; see 'help config'. Unless --revision is specified, 962
992 then the latest revision of the root solutions is checked out, with 963 Unless --revision is specified, then the latest revision of the root solutions
993 dependent submodule versions updated according to DEPS files. 964 is checked out, with dependent submodule versions updated according to DEPS
994 If --revision is specified, then the given revision is used in place 965 files. If --revision is specified, then the given revision is used in place
995 of the latest, either for a single solution or for all solutions. 966 of the latest, either for a single solution or for all solutions.
996 Unless the --force option is provided, solutions and modules whose 967 Unless the --force option is provided, solutions and modules whose
997 local revision matches the one to update (i.e., they have not changed 968 local revision matches the one to update (i.e., they have not changed
998 in the repository) are *not* modified. Unless --nohooks is provided, 969 in the repository) are *not* modified. Unless --nohooks is provided,
999 the hooks are run. 970 the hooks are run. See 'help config' for more information.
1000 971
1001 usage: gclient sync [options] [--] [SCM update options/args] 972 usage: gclient sync [options] [--] [SCM update options/args]
1002 973
1003 Valid options: 974 Valid options:
1004 --force : force update even for unchanged modules 975 --force : force update even for unchanged modules
1005 --nohooks : don't run the hooks after the update is complete 976 --nohooks : don't run the hooks after the update is complete
1006 --revision SOLUTION@REV : update given solution to specified revision 977 --revision SOLUTION@REV : update given solution to specified revision
1007 --deps PLATFORM(S) : sync deps for the given platform(s), or 'all' 978 --deps PLATFORM(S) : sync deps for the given platform(s), or 'all'
1008 --verbose : output additional diagnostics 979 --verbose : output additional diagnostics
1009 --head : update to latest revision, instead of last good 980 --head : update to latest revision, instead of last good
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 if len(rev): 1016 if len(rev):
1046 options.revisions.append(s['name']+'@'+rev) 1017 options.revisions.append(s['name']+'@'+rev)
1047 1018
1048 if options.verbose: 1019 if options.verbose:
1049 # Print out the .gclient file. This is longer than if we just printed the 1020 # Print out the .gclient file. This is longer than if we just printed the
1050 # client dict, but more legible, and it might contain helpful comments. 1021 # client dict, but more legible, and it might contain helpful comments.
1051 print(client.ConfigContent()) 1022 print(client.ConfigContent())
1052 return client.RunOnDeps('update', args) 1023 return client.RunOnDeps('update', args)
1053 1024
1054 1025
1055 def CMDupdate(options, args): 1026 def CMDupdate(parser, options, args):
1056 """Alias for the sync command. Deprecated. 1027 """Alias for the sync command. Deprecated."""
1057 """ 1028 return CMDsync(parser, options, args)
1058 return CMDsync(options, args)
1059 1029
1060 1030
1061 def CMDdiff(options, args): 1031 def CMDdiff(parser, options, args):
1062 """Display the differences between two revisions of modules. 1032 """Display the differences between two revisions of modules.
1033
1063 (Does 'svn diff' for each checked out module and dependences.) 1034 (Does 'svn diff' for each checked out module and dependences.)
1064 Additional args and options to 'svn diff' can be passed after 1035 Additional args and options to 'svn diff' can be passed after
1065 gclient options. 1036 gclient options.
1066 1037
1067 usage: diff [options] [--] [svn args/options] 1038 usage: diff [options] [--] [svn args/options]
1068 1039
1069 Valid options: 1040 Valid options:
1070 --verbose : output additional diagnostics 1041 --verbose : output additional diagnostics
1071 1042
1072 Examples: 1043 Examples:
1073 gclient diff 1044 gclient diff
1074 simple 'svn diff' for configured client and dependences 1045 simple 'svn diff' for configured client and dependences
1075 gclient diff -- -x -b 1046 gclient diff -- -x -b
1076 use 'svn diff -x -b' to suppress whitespace-only differences 1047 use 'svn diff -x -b' to suppress whitespace-only differences
1077 gclient diff -- -r HEAD -x -b 1048 gclient diff -- -r HEAD -x -b
1078 diff versus the latest version of each module 1049 diff versus the latest version of each module
1079 """ 1050 """
1080 client = GClient.LoadCurrentConfig(options) 1051 client = GClient.LoadCurrentConfig(options)
1081 if not client: 1052 if not client:
1082 raise gclient_utils.Error("client not configured; see 'gclient config'") 1053 raise gclient_utils.Error("client not configured; see 'gclient config'")
1083 if options.verbose: 1054 if options.verbose:
1084 # Print out the .gclient file. This is longer than if we just printed the 1055 # Print out the .gclient file. This is longer than if we just printed the
1085 # client dict, but more legible, and it might contain helpful comments. 1056 # client dict, but more legible, and it might contain helpful comments.
1086 print(client.ConfigContent()) 1057 print(client.ConfigContent())
1087 return client.RunOnDeps('diff', args) 1058 return client.RunOnDeps('diff', args)
1088 1059
1089 1060
1090 def CMDrevert(options, args): 1061 def CMDrevert(parser, options, args):
1091 """Revert every file in every managed directory in the client view. 1062 """Revert every file in every managed directory in the client view."""
1092 """
1093 client = GClient.LoadCurrentConfig(options) 1063 client = GClient.LoadCurrentConfig(options)
1094 if not client: 1064 if not client:
1095 raise gclient_utils.Error("client not configured; see 'gclient config'") 1065 raise gclient_utils.Error("client not configured; see 'gclient config'")
1096 return client.RunOnDeps('revert', args) 1066 return client.RunOnDeps('revert', args)
1097 1067
1098 1068
1099 def CMDrunhooks(options, args): 1069 def CMDrunhooks(parser, options, args):
1100 """Runs hooks for files that have been modified in the local working copy, 1070 """Runs hooks for files that have been modified in the local working copy.
1101 according to 'svn status'. Implies --force. 1071
1072 Implies --force.
1102 1073
1103 usage: runhooks [options] 1074 usage: runhooks [options]
1104 1075
1105 Valid options: 1076 Valid options:
1106 --verbose : output additional diagnostics 1077 --verbose : output additional diagnostics
1107 """ 1078 """
1108 client = GClient.LoadCurrentConfig(options) 1079 client = GClient.LoadCurrentConfig(options)
1109 if not client: 1080 if not client:
1110 raise gclient_utils.Error("client not configured; see 'gclient config'") 1081 raise gclient_utils.Error("client not configured; see 'gclient config'")
1111 if options.verbose: 1082 if options.verbose:
1112 # Print out the .gclient file. This is longer than if we just printed the 1083 # Print out the .gclient file. This is longer than if we just printed the
1113 # client dict, but more legible, and it might contain helpful comments. 1084 # client dict, but more legible, and it might contain helpful comments.
1114 print(client.ConfigContent()) 1085 print(client.ConfigContent())
1115 options.force = True 1086 options.force = True
1116 return client.RunOnDeps('runhooks', args) 1087 return client.RunOnDeps('runhooks', args)
1117 1088
1118 1089
1119 def CMDrevinfo(options, args): 1090 def CMDrevinfo(parser, options, args):
1120 """Outputs source path, server URL and revision information for every 1091 """Outputs defails for every dependencies.
1092
1093 This includes source path, server URL and revision information for every
1121 dependency in all solutions. 1094 dependency in all solutions.
1122 1095
1123 usage: revinfo [options] 1096 usage: revinfo [options]
1124 """ 1097 """
1125 __pychecker__ = 'unusednames=args' 1098 __pychecker__ = 'unusednames=args'
1126 client = GClient.LoadCurrentConfig(options) 1099 client = GClient.LoadCurrentConfig(options)
1127 if not client: 1100 if not client:
1128 raise gclient_utils.Error("client not configured; see 'gclient config'") 1101 raise gclient_utils.Error("client not configured; see 'gclient config'")
1129 client.PrintRevInfo() 1102 client.PrintRevInfo()
1130 return 0 1103 return 0
1131 1104
1132 1105
1133 def DispatchCommand(command, options, args): 1106 def CMDhelp(parser, options, args):
1134 """Dispatches the appropriate subcommand based on command line arguments. 1107 """Prints general help or command-specific documentation."""
1135 """ 1108 if len(args) == 1:
1136 module = sys.modules[__name__] 1109 command = Command(args[0])
1137 command = getattr(module, 'CMD' + command, None) 1110 if command:
1138 if command: 1111 print getattr(sys.modules[__name__], 'CMD' + args[0]).__doc__
1139 return command(options, args) 1112 return 0
1140 else: 1113 parser.usage = (DEFAULT_USAGE_TEXT + '\nCommands are:\n' + '\n'.join([
1141 raise gclient_utils.Error("unknown subcommand '%s'; see 'gclient help'" % 1114 ' %-10s %s' % (fn[3:], Command(fn[3:]).__doc__.split('\n')[0].strip())
1142 command) 1115 for fn in dir(sys.modules[__name__]) if fn.startswith('CMD')]))
1116 parser.print_help()
1117 return 0
1118
1119
1120 def Command(command):
1121 return getattr(sys.modules[__name__], 'CMD' + command, CMDhelp)
1143 1122
1144 1123
1145 def Main(argv): 1124 def Main(argv):
1146 option_parser = optparse.OptionParser(usage=DEFAULT_USAGE_TEXT, 1125 parser = optparse.OptionParser(usage=DEFAULT_USAGE_TEXT,
1147 version=__version__) 1126 version='%prog ' + __version__)
1148 option_parser.add_option("--force", action="store_true", 1127 parser.add_option("-v", "--verbose", action="count", default=0,
1149 help="(update/sync only) force update even " 1128 help="Produces additional output for diagnostics. Can be "
1150 "for modules which haven't changed") 1129 "used up to three times for more logging info.")
1151 option_parser.add_option("--nohooks", action="store_true", 1130 parser.add_option("--gclientfile", metavar="FILENAME", dest="config_filename",
1152 help="(update/sync/revert only) prevent the hooks " 1131 default=os.environ.get("GCLIENT_FILE", ".gclient"),
1153 "from running") 1132 help="Specify an alternate .gclient file")
1154 option_parser.add_option("--revision", action="append", dest="revisions", 1133 # The other options will be moved eventually.
1155 metavar="REV", default=[], 1134 parser.add_option("--force", action="store_true",
1156 help="(update/sync only) sync to a specific " 1135 help="(update/sync only) force update even "
1157 "revision, can be used multiple times for " 1136 "for modules which haven't changed")
1158 "each solution, e.g. --revision=src@123, " 1137 parser.add_option("--nohooks", action="store_true",
1159 "--revision=internal@32") 1138 help="(update/sync/revert only) prevent the hooks "
1160 option_parser.add_option("--deps", dest="deps_os", metavar="OS_LIST", 1139 "from running")
1161 help="(update/sync only) sync deps for the " 1140 parser.add_option("--revision", action="append", dest="revisions",
1162 "specified (comma-separated) platform(s); " 1141 metavar="REV", default=[],
1163 "'all' will sync all platforms") 1142 help="(update/sync only) sync to a specific "
1164 option_parser.add_option("--reset", action="store_true", 1143 "revision, can be used multiple times for "
1165 help="(update/sync only) resets any local changes " 1144 "each solution, e.g. --revision=src@123, "
1166 "before updating (git only)") 1145 "--revision=internal@32")
1167 option_parser.add_option("--spec", 1146 parser.add_option("--deps", dest="deps_os", metavar="OS_LIST",
1168 help="(config only) create a gclient file " 1147 help="(update/sync only) sync deps for the "
1169 "containing the provided string") 1148 "specified (comma-separated) platform(s); "
1170 option_parser.add_option("-v", "--verbose", action="count", default=0, 1149 "'all' will sync all platforms")
1171 help="produce additional output for diagnostics") 1150 parser.add_option("--reset", action="store_true",
1172 option_parser.add_option("--manually_grab_svn_rev", action="store_true", 1151 help="(update/sync only) resets any local changes "
1173 help="Skip svn up whenever possible by requesting " 1152 "before updating (git only)")
1174 "actual HEAD revision from the repository") 1153 parser.add_option("--spec",
1175 option_parser.add_option("--head", action="store_true", 1154 help="(config only) create a gclient file "
1176 help="skips any safesync_urls specified in " 1155 "containing the provided string")
1177 "configured solutions") 1156 parser.add_option("--manually_grab_svn_rev", action="store_true",
1178 option_parser.add_option("--delete_unversioned_trees", action="store_true", 1157 help="Skip svn up whenever possible by requesting "
1179 help="on update, delete any unexpected " 1158 "actual HEAD revision from the repository")
1180 "unversioned trees that are in the checkout") 1159 parser.add_option("--head", action="store_true",
1181 option_parser.add_option("--snapshot", action="store_true", 1160 help="skips any safesync_urls specified in "
1182 help="(revinfo only), create a snapshot file " 1161 "configured solutions")
1183 "of the current version of all repositories") 1162 parser.add_option("--delete_unversioned_trees", action="store_true",
1184 option_parser.add_option("--name", 1163 help="on update, delete any unexpected "
1185 help="specify alternate relative solution path") 1164 "unversioned trees that are in the checkout")
1186 option_parser.add_option("--gclientfile", metavar="FILENAME", 1165 parser.add_option("--snapshot", action="store_true",
1187 help="specify an alternate .gclient file") 1166 help="(revinfo only), create a snapshot file "
1167 "of the current version of all repositories")
1168 parser.add_option("--name",
1169 help="specify alternate relative solution path")
1170 # Integrate standard options processing.
1171 old_parser = parser.parse_args
1172 def Parse(args):
1173 (options, args) = old_parser(args)
1174 if options.verbose == 2:
1175 logging.basicConfig(level=logging.INFO)
1176 elif options.verbose > 2:
1177 logging.basicConfig(level=logging.DEBUG)
1178 options.entries_filename = options.config_filename + "_entries"
1179 return (options, args)
1180 parser.parse_args = Parse
1181 # We don't want wordwrapping in epilog (usually examples)
1182 parser.format_epilog = lambda _: parser.epilog or ''
1188 1183
1189 if len(argv) < 2: 1184 if not len(argv):
1190 # Users don't need to be told to use the 'help' command. 1185 argv = ['help']
1191 option_parser.print_help()
1192 return 1
1193 # Add manual support for --version as first argument. 1186 # Add manual support for --version as first argument.
1194 if argv[1] == '--version': 1187 if argv[0] == '--version':
1195 option_parser.print_version() 1188 parser.print_version()
1196 return 0 1189 return 0
1197
1198 # Add manual support for --help as first argument. 1190 # Add manual support for --help as first argument.
1199 if argv[1] == '--help': 1191 if argv[0] == '--help':
1200 argv[1] = 'help' 1192 argv[0] = 'help'
1201 1193 options, args = parser.parse_args(argv[1:])
1202 command = argv[1] 1194 return Command(argv[0])(parser, options, args)
1203 options, args = option_parser.parse_args(argv[2:])
1204
1205 if len(argv) < 3 and command == "help":
1206 option_parser.print_help()
1207 return 0
1208
1209 if options.verbose > 1:
1210 logging.basicConfig(level=logging.DEBUG)
1211
1212 # Files used for configuration and state saving.
1213 options.config_filename = os.environ.get("GCLIENT_FILE", ".gclient")
1214 if options.gclientfile:
1215 options.config_filename = options.gclientfile
1216 options.entries_filename = options.config_filename + "_entries"
1217 options.deps_file = "DEPS"
1218
1219 options.platform = sys.platform
1220 return DispatchCommand(command, options, args)
1221 1195
1222 1196
1223 if "__main__" == __name__: 1197 if "__main__" == __name__:
1224 try: 1198 try:
1225 result = Main(sys.argv) 1199 sys.exit(Main(sys.argv[1:]))
1226 except gclient_utils.Error, e: 1200 except gclient_utils.Error, e:
1227 print >> sys.stderr, "Error: %s" % str(e) 1201 print >> sys.stderr, "Error: %s" % str(e)
1228 result = 1 1202 sys.exit(1)
1229 sys.exit(result)
1230 1203
1231 # vim: ts=2:sw=2:tw=80:et: 1204 # vim: ts=2:sw=2:tw=80:et:
OLDNEW
« no previous file with comments | « no previous file | tests/gclient_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698