darcs-2.1.2.1: src/Darcs/URL.hs
{-# OPTIONS_GHC -cpp #-}
{-# LANGUAGE CPP #-}
{-
Copyright (C) 2004 David Roundy
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
-}
{-|
Path resolving:
* A URL contains the sequence @\":\/\/\"@.
* A local filepath does not contain colons, except
as second character (windows drives).
* A path that is neither a URL nor a local file
is an ssh-path.
Examples:
> /usr/repo/foo -- local file
> c:/src/darcs -- local file
> http://darcs.net/ -- URL
> peter@host:/path -- ssh
> droundy@host: -- ssh
> host:/path -- ssh
This means that single-letter hosts in ssh-paths do not work,
unless a username is provided.
Perhaps ssh-paths should use @\"ssh:\/\/user\@host\/path\"@-syntax instead?
-}
module Darcs.URL (
is_file, is_url, is_ssh, is_relative, is_absolute,
is_ssh_nopath
) where
#include "impossible.h"
is_relative :: String -> Bool
is_relative (_:':':_) = False
is_relative f@(c:_) = is_file f && c /= '/' && c /= '~'
is_relative "" = bug "Empty filename in is_relative"
is_absolute :: String -> Bool
is_absolute f = is_file f && (not $ is_relative f)
is_file :: String -> Bool
is_file (_:_:fou) = ':' `notElem` fou
is_file _ = True
is_url :: String -> Bool
is_url (':':'/':'/':_:_) = True
is_url (_:x) = is_url x
is_url "" = False
is_ssh :: String -> Bool
is_ssh s = not (is_file s || is_url s)
is_ssh_nopath :: String -> Bool
is_ssh_nopath s = case reverse s of
':':x@(_:_:_) -> ':' `notElem` x
_ -> False