/**
   * Gets a repo by its URL. If URL is unknown, returns a new location, adding it to the global
   * repositories cache. Will update stored last user and password with the provided values.
   */
  public IHgRepositoryLocation updateRepoLocation(
      HgRoot hgRoot, String url, String logicalName, String user, String pass) throws HgException {
    IHgRepositoryLocation loc = matchRepoLocation(url);

    if (loc == null) {
      // in some cases url may be a repository database line
      loc = HgRepositoryLocationParser.parseLocation(logicalName, url, user, pass);
      addRepoLocation(loc);
      return loc;
    }

    boolean update = false;

    String myLogicalName = logicalName;
    String myUser = user;
    String myPass = pass;

    if (logicalName != null
        && logicalName.length() > 0
        && !logicalName.equals(loc.getLogicalName())) {
      update = true;
    } else {
      myLogicalName = loc.getLogicalName();
    }
    if (user != null && user.length() > 0 && !user.equals(loc.getUser())) {
      update = true;
    } else {
      myUser = loc.getUser();
    }
    if (pass != null && pass.length() > 0 && !pass.equals(loc.getPassword())) {
      update = true;
    } else {
      myPass = loc.getPassword();
    }

    if (update) {
      IHgRepositoryLocation updated =
          HgRepositoryLocationParser.parseLocation(
              myLogicalName, loc.getLocation(), myUser, myPass);

      synchronized (entriesLock) {
        for (Set<IHgRepositoryLocation> locs : rootRepos.values()) {
          if (locs.remove(updated)) {
            locs.add(updated);
          }
        }
      }
      synchronized (repoHistory) {
        if (repoHistory.remove(updated)) {
          repoHistory.add(updated);
        }
      }
      repositoryModified(updated);
      return updated;
    }

    return loc;
  }
  /**
   * Get a repo specified by properties. If repository for given url is unknown, returns a new
   * location.
   *
   * @return never returns null
   */
  public IHgRepositoryLocation getRepoLocation(Properties props) throws HgException {
    String user = props.getProperty("user"); // $NON-NLS-1$
    if ((user == null) || (user.length() == 0)) {
      user = null;
    }
    String password = props.getProperty("password"); // $NON-NLS-1$
    if (user == null) {
      password = null;
    }
    String url = props.getProperty("url"); // $NON-NLS-1$
    if (url == null) {
      throw new HgException(
          Messages.getString("HgRepositoryLocation.urlMustNotBeNull")); // $NON-NLS-1$
    }

    IHgRepositoryLocation location = matchRepoLocation(url);
    if (location != null) {
      if (user == null
          || user.length() == 0
          || (user.equals(location.getUser())
              && (password == null || password.equals(location.getPassword())))) {
        return location;
      }
    }

    // make a new location if no matches exist or it's a different user
    return HgRepositoryLocationParser.parseLocation(url, user, password);
  }
  /**
   * Get a repo by its URL. If URL is unknown, returns a new location.
   *
   * @return never returns null
   */
  public IHgRepositoryLocation getRepoLocation(String url, String user, String pass)
      throws HgException {
    getProjectRepos();
    IHgRepositoryLocation location = matchRepoLocation(url);
    if (location != null) {
      if (user == null
          || user.length() == 0
          || (user.equals(location.getUser())
              && (pass == null || pass.equals(location.getPassword())))) {
        return location;
      }
    }

    // make a new location if no matches exist or it's a different user
    return HgRepositoryLocationParser.parseLocation(url, user, pass);
  }