#!/usr/bin/env tclsh
###############################################################################
# BRLTTY - A background process providing access to the console screen (when in
#          text mode) for a blind person using a refreshable braille display.
#
# Copyright (C) 1995-2023 by The BRLTTY Developers.
#
# BRLTTY comes with ABSOLUTELY NO WARRANTY.
#
# This is free software, placed under the terms of the
# GNU Lesser General Public License, as published by the Free Software
# Foundation; either version 2.1 of the License, or (at your option) any
# later version. Please see the file LICENSE-LGPL for details.
#
# Web Page: http://brltty.app/
#
# This software is maintained by Dave Mielke <dave@mielke.cc>.
###############################################################################

source [file join [file dirname [info script]] "prologue.tcl"]

set optionDefinitions {
}

processProgramArguments optionValues $optionDefinitions

proc executeCommand {args} {
   if {[catch $args response] == 0} {
      set response ""
   } elseif {[string equal [lindex $::errorCode 0] CHILDSTATUS]} {
      set response "host command failed: exit status [lindex $::errorCode 2]"
   }

   return $response
}

proc setWorkingDirectory {path} {
   logDetail "working directory: $path"
   set problem [executeCommand cd $path]

   if {[string length $problem] > 0} {
      semanticError "$problem"
   }
}

proc executeHostCommand {args} {
   set command [join $args " "]
   logDetail "executing host command: $command"

   set args [linsert $args 0 exec <@ stdin]
   lappend args >@ stdout 2>@ stderr
   set problem [eval executeCommand $args]

   if {[string length $problem] > 0} {
      semanticError "$problem: $command"
   }
}

proc executeGradleTask {task} {
   executeHostCommand ./gradlew --quiet --console plain -- $task
}

setWorkingDirectory $sourceRoot
executeHostCommand ./autogen
executeHostCommand ./cfg-android

setWorkingDirectory $gradleDirectory
executeGradleTask clean
executeGradleTask :app:assembleDebug
executeGradleTask :app:assembleRelease

logMessage task "done"
exit 0
