OLD | NEW |
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 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 else: | 766 else: |
767 # Delete the entry | 767 # Delete the entry |
768 print("\n________ deleting \'%s\' " + | 768 print("\n________ deleting \'%s\' " + |
769 "in \'%s\'") % (entry_fixed, self._root_dir) | 769 "in \'%s\'") % (entry_fixed, self._root_dir) |
770 gclient_utils.RemoveDirectory(e_dir) | 770 gclient_utils.RemoveDirectory(e_dir) |
771 # record the current list of entries for next time | 771 # record the current list of entries for next time |
772 self._SaveEntries(entries) | 772 self._SaveEntries(entries) |
773 | 773 |
774 def PrintRevInfo(self): | 774 def PrintRevInfo(self): |
775 """Output revision info mapping for the client and its dependencies. This | 775 """Output revision info mapping for the client and its dependencies. This |
776 allows the capture of a overall "revision" for the source tree that can | 776 allows the capture of an overall "revision" for the source tree that can |
777 be used to reproduce the same tree in the future. The actual output | 777 be used to reproduce the same tree in the future. The actual output |
778 contains enough information (source paths, svn server urls and revisions) | 778 contains enough information (source paths, svn server urls and revisions) |
779 that it can be used either to generate external svn commands (without | 779 that it can be used either to generate external svn commands (without |
780 gclient) or as input to gclient's --rev option (with some massaging of | 780 gclient) or as input to gclient's --rev option (with some massaging of |
781 the data). | 781 the data). |
782 | 782 |
783 NOTE: Unlike RunOnDeps this does not require a local checkout and is run | |
784 on the Pulse master. It MUST NOT execute hooks. | |
785 | |
786 Raises: | 783 Raises: |
787 Error: If the client has conflicting entries. | 784 Error: If the client has conflicting entries. |
788 """ | 785 """ |
789 # Check for revision overrides. | 786 # Check for revision overrides. |
790 revision_overrides = {} | 787 revision_overrides = {} |
791 for revision in self._options.revisions: | 788 for revision in self._options.revisions: |
792 if revision.find("@") < 0: | 789 if revision.find("@") < 0: |
793 raise gclient_utils.Error( | 790 raise gclient_utils.Error( |
794 "Specify the full dependency when specifying a revision number.") | 791 "Specify the full dependency when specifying a revision number.") |
795 revision_elem = revision.split("@") | 792 revision_elem = revision.split("@") |
(...skipping 27 matching lines...) Expand all Loading... |
823 else: | 820 else: |
824 return (url, revision) | 821 return (url, revision) |
825 | 822 |
826 # Run on the base solutions first. | 823 # Run on the base solutions first. |
827 for solution in solutions: | 824 for solution in solutions: |
828 name = solution["name"] | 825 name = solution["name"] |
829 if name in entries: | 826 if name in entries: |
830 raise gclient_utils.Error("solution %s specified more than once" % name) | 827 raise gclient_utils.Error("solution %s specified more than once" % name) |
831 (url, rev) = GetURLAndRev(name, solution["url"]) | 828 (url, rev) = GetURLAndRev(name, solution["url"]) |
832 entries[name] = "%s@%s" % (url, rev) | 829 entries[name] = "%s@%s" % (url, rev) |
833 # TODO(aharper): SVN/SCMWrapper cleanup (non-local commandset) | 830 deps_file = solution.get("deps_file", self._options.deps_file) |
834 entries_deps_content[name] = gclient_scm.scm.SVN.Capture( | 831 if '/' in deps_file or '\\' in deps_file: |
835 ["cat", | 832 raise gclient_utils.Error('deps_file name must not be a path, just a ' |
836 "%s/%s@%s" % (url, | 833 'filename.') |
837 self._options.deps_file, | 834 try: |
838 rev)], | 835 deps_content = gclient_utils.FileRead( |
839 os.getcwd()) | 836 os.path.join(self._root_dir, name, deps_file)) |
| 837 except IOError, e: |
| 838 if e.errno != errno.ENOENT: |
| 839 raise |
| 840 deps_content = "" |
| 841 entries_deps_content[name] = deps_content |
840 | 842 |
841 # Process the dependencies next (sort alphanumerically to ensure that | 843 # Process the dependencies next (sort alphanumerically to ensure that |
842 # containing directories get populated first and for readability) | 844 # containing directories get populated first and for readability) |
843 deps = self._ParseAllDeps(entries, entries_deps_content) | 845 deps = self._ParseAllDeps(entries, entries_deps_content) |
844 deps_to_process = deps.keys() | 846 deps_to_process = deps.keys() |
845 deps_to_process.sort() | 847 deps_to_process.sort() |
846 | 848 |
847 # First pass for direct dependencies. | 849 # First pass for direct dependencies. |
848 for d in deps_to_process: | 850 for d in deps_to_process: |
849 if type(deps[d]) == str: | 851 if type(deps[d]) == str: |
850 (url, rev) = GetURLAndRev(d, deps[d]) | 852 (url, rev) = GetURLAndRev(d, deps[d]) |
851 entries[d] = "%s@%s" % (url, rev) | 853 entries[d] = "%s@%s" % (url, rev) |
852 | 854 |
853 # Second pass for inherited deps (via the From keyword) | 855 # Second pass for inherited deps (via the From keyword) |
854 for d in deps_to_process: | 856 for d in deps_to_process: |
855 if type(deps[d]) != str: | 857 if type(deps[d]) != str: |
856 deps_parent_url = entries[deps[d].module_name] | 858 deps_parent_url = entries[deps[d].module_name] |
857 if deps_parent_url.find("@") < 0: | 859 if deps_parent_url.find("@") < 0: |
858 raise gclient_utils.Error("From %s missing revisioned url" % | 860 raise gclient_utils.Error("From %s missing revisioned url" % |
859 deps[d].module_name) | 861 deps[d].module_name) |
860 content = gclient_utils.FileRead(os.path.join(self._root_dir, | 862 content = gclient_utils.FileRead(os.path.join(self._root_dir, |
861 deps[d].module_name, | 863 deps[d].module_name, |
862 self._options.deps_file)) | 864 self._options.deps_file)) |
863 sub_deps = self._ParseSolutionDeps(deps[d].module_name, content, {}) | 865 sub_deps = self._ParseSolutionDeps(deps[d].module_name, content, {}) |
864 (url, rev) = GetURLAndRev(d, sub_deps[d]) | 866 (url, rev) = GetURLAndRev(d, sub_deps[d]) |
865 entries[d] = "%s@%s" % (url, rev) | 867 entries[d] = "%s@%s" % (url, rev) |
866 print(";\n\n".join(["%s: %s" % (x, entries[x]) | 868 print(";\n".join(["%s: %s" % (x, entries[x]) |
867 for x in sorted(entries.keys())])) | 869 for x in sorted(entries.keys())])) |
868 | 870 |
869 | 871 |
870 ## gclient commands. | 872 ## gclient commands. |
871 | 873 |
872 | 874 |
873 def DoCleanup(options, args): | 875 def DoCleanup(options, args): |
874 """Handle the cleanup subcommand. | 876 """Handle the cleanup subcommand. |
875 | 877 |
876 Raises: | 878 Raises: |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1184 | 1186 |
1185 if "__main__" == __name__: | 1187 if "__main__" == __name__: |
1186 try: | 1188 try: |
1187 result = Main(sys.argv) | 1189 result = Main(sys.argv) |
1188 except gclient_utils.Error, e: | 1190 except gclient_utils.Error, e: |
1189 print >> sys.stderr, "Error: %s" % str(e) | 1191 print >> sys.stderr, "Error: %s" % str(e) |
1190 result = 1 | 1192 result = 1 |
1191 sys.exit(result) | 1193 sys.exit(result) |
1192 | 1194 |
1193 # vim: ts=2:sw=2:tw=80:et: | 1195 # vim: ts=2:sw=2:tw=80:et: |
OLD | NEW |