diff --git a/cmd/camput/android.go b/cmd/camput/android.go index 15c5d4bc2..1197d9ffb 100644 --- a/cmd/camput/android.go +++ b/cmd/camput/android.go @@ -19,7 +19,7 @@ limitations under the License. package main import ( - "camlistore.org/pkg/client" + "camlistore.org/pkg/client/android" ) type allStats struct { @@ -35,7 +35,7 @@ func printAndroidCamputStatus(t *TreeUpload) { } lastStatBroadcast = bcast - client.Androidf("STATS nfile=%d nbyte=%d skfile=%d skbyte=%d upfile=%d upbyte=%d\n", + android.Printf("STATS nfile=%d nbyte=%d skfile=%d skbyte=%d upfile=%d upbyte=%d\n", t.total.files, t.total.bytes, t.skipped.files, t.skipped.bytes, t.uploaded.files, t.uploaded.bytes) diff --git a/cmd/camput/files.go b/cmd/camput/files.go index ca4fc27c7..f42b71330 100644 --- a/cmd/camput/files.go +++ b/cmd/camput/files.go @@ -40,6 +40,7 @@ import ( "camlistore.org/pkg/blobserver" statspkg "camlistore.org/pkg/blobserver/stats" "camlistore.org/pkg/client" + "camlistore.org/pkg/client/android" "camlistore.org/pkg/cmdmain" "camlistore.org/pkg/schema" ) @@ -91,7 +92,7 @@ func init() { cmd.havecache = true cmd.statcache = true } - if client.AndroidOutput() { + if android.IsChild() { flags.BoolVar(&cmd.argsFromInput, "stdinargs", false, "If true, filenames to upload are sent one-per-line on stdin. EOF means to quit the process with exit status 0.") } flagCacheLog = flags.Bool("logcache", false, "log caching details") @@ -412,7 +413,7 @@ func (up *Uploader) statReceiver(n *node) blobserver.StatReceiver { // see TODO in cmd/camput/uploader.go statReceiver = up.Client } - if client.AndroidOutput() && n != nil && n.fi.Mode()&os.ModeType == 0 { + if android.IsChild() && n != nil && n.fi.Mode()&os.ModeType == 0 { return client.AndroidStatusReceiver{Sr: statReceiver, Path: n.fullPath} } return statReceiver @@ -929,7 +930,7 @@ func (t *TreeUpload) run() { var lastStat, lastUpload string dumpStats := func() { - if client.AndroidOutput() { + if android.IsChild() { printAndroidCamputStatus(t) return } diff --git a/pkg/client/android.go b/pkg/client/android.go index ae37a6fb3..b034d7ddf 100644 --- a/pkg/client/android.go +++ b/pkg/client/android.go @@ -32,10 +32,10 @@ import ( "os/exec" "path/filepath" "regexp" - "strconv" "sync" "camlistore.org/pkg/blob" + "camlistore.org/pkg/client/android" "camlistore.org/pkg/blobserver" "camlistore.org/pkg/schema" ) @@ -73,7 +73,7 @@ func (ni *namedInt) Incr(delta int64) { ni.val += delta nv := ni.val ni.Unlock() - Androidf("STAT %s %d\n", ni.name, nv) + android.Printf("STAT %s %d\n", ni.name, nv) } var ( @@ -235,23 +235,10 @@ func androidTLSConfig() (*tls.Config, error) { return cfg, nil } -// TODO(mpl): distinguish CAMPUT, CAMGET, etc -var androidOutput, _ = strconv.ParseBool(os.Getenv("CAMPUT_ANDROID_OUTPUT")) - -func AndroidOutput() bool { - return androidOutput -} - -var androidOutMu sync.Mutex - -func Androidf(format string, args ...interface{}) { - androidOutMu.Lock() - defer androidOutMu.Unlock() - fmt.Printf(format, args...) -} - +// NoteFileUploaded is a hook for camput to report that a file +// was uploaded. TODO: move this to pkg/client/android probably. func NoteFileUploaded(fullPath string, uploaded bool) { - if !AndroidOutput() { + if !android.IsChild() { return } if uploaded { @@ -259,7 +246,7 @@ func NoteFileUploaded(fullPath string, uploaded bool) { } else { statFileExisted.Incr(1) } - Androidf("FILE_UPLOADED %s\n", fullPath) + android.Printf("FILE_UPLOADED %s\n", fullPath) } // androidStatusReceiver is a blobserver.StatReceiver wrapper that @@ -271,7 +258,7 @@ type AndroidStatusReceiver struct { } func (asr AndroidStatusReceiver) noteChunkOnServer(sb blob.SizedRef) { - Androidf("CHUNK_UPLOADED %d %s %s\n", sb.Size, sb.Ref, asr.Path) + android.Printf("CHUNK_UPLOADED %d %s %s\n", sb.Size, sb.Ref, asr.Path) } func (asr AndroidStatusReceiver) ReceiveBlob(blob blob.Ref, source io.Reader) (blob.SizedRef, error) { diff --git a/pkg/client/android/android.go b/pkg/client/android/android.go new file mode 100644 index 000000000..9f48692c9 --- /dev/null +++ b/pkg/client/android/android.go @@ -0,0 +1,45 @@ +/* +Copyright 2013 The Camlistore Authors + +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. +*/ + +// Package android contains code specific to running the Camlistore client +// code as a child process on Android. This removes ugly API from the +// client package itself. +package android + +import ( + "fmt" + "strconv" + "os" + "sync" +) + +// TODO(mpl): distinguish CAMPUT, CAMGET, etc +var androidOutput, _ = strconv.ParseBool(os.Getenv("CAMPUT_ANDROID_OUTPUT")) + +// IsChild reports whether this process is running as an Android +// child process and should report its output in the form that the +// Android uploader app expects. +func IsChild() bool { + return androidOutput +} + +var androidOutMu sync.Mutex + +func Printf(format string, args ...interface{}) { + androidOutMu.Lock() + defer androidOutMu.Unlock() + fmt.Printf(format, args...) +}