(use-modules (srfi srfi-1))

(define (ignore-errors thunk)
  (catch #t thunk (lambda args #f)))

(define (ensure-directory! directory-name)
  (or (ignore-errors (lambda () (opendir directory-name)))
      (mkdir directory-name)))

(define project-root (getcwd))

(define (absolutize . paths)
  (string-join (cons project-root paths)  "/"))

(define external-repositories
  '((#:subversion ("http://connectbot.googlecode.com/svn/trunk/connectbot/"
                   "ConnectBot"))
    (#:darcs ("http://darcs.unknownlamer.org/android-superuser"
              "Superuser")
             ("http://darcs.unknownlamer.org/android-vnc-viewer"
              "android-vnc-viewer"))))

(define (fetch-external-repositories!)
  (ensure-directory! "external")
  (let ((subversion-repos (cdr (assoc #:subversion external-repositories)))
        (darcs-repos (cdr (assoc #:darcs external-repositories))))
    (map (lambda (repo)
           (system* "svn" "checkout"
                    (first repo)
                    (absolutize "external" (second repo))))
         subversion-repos)
    (map (lambda (repo)
           (let ((target (absolutize "external" (second repo))))
             (if (not (file-exists? target))
                 (system* "darcs" "get"
                          (first repo)
                          target))))
         darcs-repos)))

(define (update-external-repositories!)
  (let ((subversion-repos (cdr (assoc #:subversion external-repositories)))
        (darcs-repos (cdr (assoc #:darcs external-repositories))))
    (map (lambda (repo)
           (let ((current-directory (getcwd))
                 (project-directory (string-join
                                     (list "external" (second repo))
                                     "/")))
             (chdir project-directory)
             (system* "svn" "update")
             (chdir current-directory)))
         subversion-repos)
    (map (lambda (repo)
           (system* "darcs" "pull" "-a"
                    "--repodir" (absolutize "external" (second repo))))
         darcs-repos)))

(define overlay-directory "vendor/replicant/overlay")

(define overlay-files
  '(("external/android-vnc-viewer/androidVNC" "packages/apps/AndroidVNC")
    ("external/ConnectBot" "packages/apps/ConnectBot")
    ("external/Superuser/Superuser" "packages/apps/Superuser")
    ("makefiles/AndroidVNC.mk" "packages/apps/AndroidVNC/Android.mk")
    ("makefiles/ConnectBot.mk" "packages/apps/ConnectBot/Android.mk")
    ("makefiles/Superuser.mk" "packages/apps/Superuser/Android.mk")))

(define (setup-overlays!)
  (map (lambda (overlay)
         (let ((target (absolutize overlay-directory (second overlay))))
           (if (file-exists? target)
               (delete-file target))
           (symlink (absolutize (first overlay))
                    target)))
       overlay-files))

(define android-root "android")

(define android-files
  '(("vendor/replicant" "vendor/replicant")
    ("external/Superuser/su/Android.mk" "system/extras/su/Android.mk")
    ("external/Superuser/su/su.c" "system/extras/su/su.c")))

(define android-patches
  '("patches/0001-follow-symlinks-when-searching-for-products.patch"
    "patches/0002-Remove-invalid-makefile-bit.patch"
    "patches/0003-Don-t-require-resource-localization.patch"))

(define (merge-android-files!) 
  (map (lambda (merge)
         (let ((target (absolutize android-root (second merge))))
           (if (file-exists? target)
               (delete-file target))
           (symlink (absolutize (first merge))
                    target)))
       android-files))

(define (patch-android-source!)
  (apply system* `( "git"
		    "--git-dir" ,(absolutize "android/build")
		    "--work-tree" ,(absolutize "android/build")
		    "apply" ,@android-patches
		    "--directory" ,(absolutize "android/build"))))
