Move the workspace-related functions out of blaze_startup_options.

This change introduces a new workspace_layout module that collects all
the static methods previously contained in the BlazeStartupOptions
class.  These methods are not part of the options so it doesn't make
sense for them to be there.

--
MOS_MIGRATED_REVID=131576959
diff --git a/src/main/cpp/workspace_layout.h b/src/main/cpp/workspace_layout.h
new file mode 100644
index 0000000..33bf81c
--- /dev/null
+++ b/src/main/cpp/workspace_layout.h
@@ -0,0 +1,77 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#ifndef BAZEL_SRC_MAIN_CPP_WORKSPACE_LAYOUT_H_
+#define BAZEL_SRC_MAIN_CPP_WORKSPACE_LAYOUT_H_
+
+#include <string>
+#include <vector>
+
+namespace blaze {
+
+using std::string;
+
+// Provides methods to compute paths related to the workspace.
+//
+// All methods in this class ought to be static because we reference them as
+// if they were global, and we do so from very early startup stages.
+//
+// The reason this is a class and not a namespace is because of historical
+// reasons, as this was split out from the BlazeStartupOptions class.
+// TODO(bazel-team): Reconsider dropping the class in favor of free functions.
+class WorkspaceLayout {
+ public:
+  WorkspaceLayout() = delete;
+
+  // Given the working directory, returns the nearest enclosing directory with a
+  // WORKSPACE file in it.  If there is no such enclosing directory, returns "".
+  //
+  // E.g., if there was a WORKSPACE file in foo/bar/build_root:
+  // GetWorkspace('foo/bar') --> ''
+  // GetWorkspace('foo/bar/build_root') --> 'foo/bar/build_root'
+  // GetWorkspace('foo/bar/build_root/biz') --> 'foo/bar/build_root'
+  //
+  // The returned path is relative or absolute depending on whether cwd was
+  // relative or absolute.
+  static string GetWorkspace(const string &cwd);
+
+  // Returns if workspace is a valid build workspace.
+  static bool InWorkspace(const string &workspace);
+
+  // Returns the basename for the rc file.
+  static string RcBasename();
+
+  // Returns the candidate pathnames for the RC files.
+  static void FindCandidateBlazercPaths(const string& workspace,
+                                        const string& cwd,
+                                        const std::vector<string>& args,
+                                        std::vector<string>* result);
+
+  // Returns the candidate pathnames for the RC file in the workspace,
+  // the first readable one of which will be chosen.
+  // It is ok if no usable candidate exists.
+  static void WorkspaceRcFileSearchPath(std::vector<string>* candidates);
+
+  // Turn a %workspace%-relative import into its true name in the filesystem.
+  // path_fragment is modified in place.
+  // Unlike WorkspaceRcFileSearchPath, it is an error if no import file exists.
+  static bool WorkspaceRelativizeRcFilePath(const string &workspace,
+                                            string *path_fragment);
+
+  static constexpr char WorkspacePrefix[] = "%workspace%/";
+  static const int WorkspacePrefixLength = sizeof WorkspacePrefix - 1;
+};
+
+}  // namespace blaze
+
+#endif  // BAZEL_SRC_MAIN_CPP_WORKSPACE_LAYOUT_H_