diff --git a/src/main/kotlin/com/beust/kobalt/Main.kt b/src/main/kotlin/com/beust/kobalt/Main.kt index 8706a767..1865a2bb 100644 --- a/src/main/kotlin/com/beust/kobalt/Main.kt +++ b/src/main/kotlin/com/beust/kobalt/Main.kt @@ -70,6 +70,7 @@ private class Main @Inject constructor( } public fun run(jc: JCommander, args: Args, argv: Array): Int { +// github.uploadRelease() // // Add all the repos from repo contributors (at least those that return values without a Project) @@ -91,7 +92,6 @@ private class Main @Inject constructor( var result = 0 val latestVersionFuture = github.latestKobaltVersion val seconds = benchmark("build", { - // runTest() try { result = runWithArgs(jc, args, argv) } catch(ex: KobaltException) { diff --git a/src/main/kotlin/com/beust/kobalt/misc/GithubApi.kt b/src/main/kotlin/com/beust/kobalt/misc/GithubApi.kt index 90cb4e45..74c5f8c7 100644 --- a/src/main/kotlin/com/beust/kobalt/misc/GithubApi.kt +++ b/src/main/kotlin/com/beust/kobalt/misc/GithubApi.kt @@ -8,8 +8,13 @@ import com.google.gson.JsonParser import com.google.gson.annotations.SerializedName import com.squareup.okhttp.OkHttpClient import retrofit.RestAdapter +import retrofit.RetrofitError import retrofit.client.OkClient +import retrofit.client.Response import retrofit.http.* +import retrofit.mime.MimeUtil +import retrofit.mime.TypedByteArray +import retrofit.mime.TypedFile import rx.Observable import java.io.BufferedReader import java.io.File @@ -28,147 +33,112 @@ import javax.inject.Inject */ public class GithubApi @Inject constructor(val executors: KobaltExecutors) { companion object { - const val HOST = - "https://api.github.com" -// "https://developer.github.com/v3/" - const val RELEASES_URL = "$HOST/repos/cbeust/kobalt/releases" + const val RELEASES_URL = "https://api.github.com/repos/cbeust/kobalt/releases" } - public class ServiceGenerator { - companion object { - val API_BASE_URL = HOST + fun uploadRelease(): Int { + val releaseName = "TestRelease" + val release = service.getReleaseByTagName(Prop.username, "kobalt", releaseName) - val httpClient = OkHttpClient() - val builder = RestAdapter.Builder() - .setEndpoint(API_BASE_URL) -// .baseUrl(API_BASE_URL) -// .addConverterFactory(GsonConverterFactory.create()) - - class Contributor { - var login: String? = null - var contributions: Int? = null - } - - class Release { - var name: String? = null - var prerelease: Boolean? = null - } - - class UploadReleaseResponse(var id: String? = null) - - class CreateRelease(@SerializedName("tag_name") var tag_name: String? = null) -// class CreateRelease( -// @Query("tag_name") tag_name: String, -// @Query("target_commitish") target: String, -// @Query("name") name: String, -// @Query("body") body: String, -// @Query("draft") draft : Boolean, -// @Query("prerelease") prerelease: Boolean -// ) - class CreateReleaseResponse(var id: String? = null) - - interface Api { - @GET("/repos/{owner}/{repo}/contributors") - fun contributors(@Path("owner") owner: String, @Path("repo") repo: String): List - - @GET("/repos/{owner}/{repo}/releases") - fun releases(@Path("owner") owner: String, @Path("repo") repo: String): List - - @POST("/repos/{owner}/{repo}/releases") - fun createRelease(@Path("owner") owner: String, - @Query("access_token") accessToken: String, - @Path("repo") repo: String, - @Body createRelease: CreateRelease - ) : Observable - - @POST("/repos/{owner}/{repo}/releases/{id}/assets") - fun uploadRelease(@Path("owner") owner: String, - @Query("access_token") accessToken: String, - @Path("repo") repo: String, - @Path("id") id: String, - @Query("name") name: String, - @Query("label") label: String, - @Body file: File, - @Query("Content-Type") contentType: String = "application/zip") - : Observable - - } - - val service : Api by lazy { ServiceGenerator.createService(Api::class.java) } - - fun createService(serviceClass: Class): S { - val retrofit = builder - .setEndpoint(HOST) - .setLogLevel(RestAdapter.LogLevel.FULL) - .setClient(OkClient(OkHttpClient())) - - // .setClient(httpClient) - .build() - return retrofit.create(serviceClass) - } - - const val ACCESS_TOKEN_PROPERTY = "github.accessToken" - const val USERNAME_PROPERTY = "github.username" - - val localProperties: Properties by lazy { - val result = Properties() - val filePath = Paths.get("local.properties") - if (! Files.exists(filePath)) { - throw KobaltException("Couldn't find a local.properties file") - } - - filePath.let { path -> - if (Files.exists(path)) { - Files.newInputStream(path).use { - result.load(it) - } - } - } - - result - } - - private fun fromProperties(name: String) : String { - val result = localProperties.get(name) - ?: throw KobaltException("Couldn't find $name in local.properties") - return result as String - } - - val accessToken: String get() = fromProperties(ACCESS_TOKEN_PROPERTY) - val username: String get() = fromProperties(USERNAME_PROPERTY) - - fun uploadRelease() : Int { - println("createRelease()") - service.createRelease(username, accessToken, "kobalt", -// hashMapOf("tag_name" to "0.502tagName") - CreateRelease("0.503tagName") -// CreateRelease().apply { tag_name = "0.500tagName"} -// CreateRelease("0.500tagName", -// "master", "0.500name", -// "A test release", -// draft = false, prerelease = true) - ) - .map { response: CreateReleaseResponse? -> - uploadRelease(response?.id!!) - println("Received id " + response?.id) - } + uploadService.uploadRelease(Prop.username, Prop.accessToken, "kobalt", release.id!!, "zipFile", "label", + TypedFile("text/plain", File(homeDir("kotlin", "kobalt", "kobalt", "src", "Build.kt")))) .subscribe( { println("success") }, - { e: Throwable -> println("error" + e)}, - { println("complete")} + { e: Throwable -> + println("error" + (e as RetrofitError).response.bodyContent()) + println("") + }, + { println("complete") } ) -// }) - Thread.sleep(10000) - return 0 - } - - fun uploadRelease(id: String) { - service.uploadRelease(username, accessToken, "kobalt", id, "The zip file", "The label", - File(homeDir("kotlin", "kobalt", "src", "Build.kt"))) - } - } + println("createRelease()") + // service.createRelease(username, accessToken, "kobalt", + //// hashMapOf("tag_name" to "0.502tagName") + // CreateRelease(releaseName) + //// CreateRelease().apply { tag_name = "0.500tagName"} + //// CreateRelease("0.500tagName", + //// "master", "0.500name", + //// "A test release", + //// draft = false, prerelease = true) + // ) + // .map { response: CreateReleaseResponse? -> + // uploadRelease(response?.id!!) + // println("Received id " + response?.id) + // } + // .subscribe( + // { println("success") }, + // { e: Throwable -> + // println("error" + (e as RetrofitError).response.bodyContent()) + // }, + // { println("complete")} + // ) + //// }) + Thread.sleep(10000) + return 0 } + // + // Read only Api + // + + private val service = RestAdapter.Builder() + .setLogLevel(RestAdapter.LogLevel.FULL) + .setClient(OkClient(OkHttpClient())) + .setEndpoint("https://api.github.com") + .build() + .create(Api::class.java) + + class Release { + var name: String? = null + var prerelease: Boolean? = null + } + + class CreateRelease(@SerializedName("tag_name") var tag_name: String? = null) + class CreateReleaseResponse(var id: String? = null) + class GetReleaseResponse(var id: String? = null, + @SerializedName("upload_url") var uploadUrl: String? = null) + + interface Api { + + @GET("/repos/{owner}/{repo}/releases/tags/{tag}") + fun getReleaseByTagName(@Path("owner") owner: String, @Path("repo") repo: String, + @Path("tag") tagName: String): GetReleaseResponse + + @GET("/repos/{owner}/{repo}/releases") + fun releases(@Path("owner") owner: String, @Path("repo") repo: String): List + + @POST("/repos/{owner}/{repo}/releases") + fun createRelease(@Path("owner") owner: String, + @Query("access_token") accessToken: String, + @Path("repo") repo: String, + @Body createRelease: CreateRelease + ): Observable + } + + // + // Upload Api + // + + val uploadService = RestAdapter.Builder() + .setEndpoint("https://uploads.github.com/") + .setLogLevel(RestAdapter.LogLevel.FULL) + .setClient(OkClient(OkHttpClient())) + .build() + .create(UploadApi::class.java) + + class UploadReleaseResponse(var id: String? = null) + + interface UploadApi { + @POST("/repos/{owner}/{repo}/releases/{id}/assets") + fun uploadRelease(@Path("owner") owner: String, + @Query("access_token") accessToken: String, + @Path("repo") repo: String, + @Path("id") id: String, + @Query("name") name: String, + @Query("label") label: String, + @Body file: TypedFile) + // @Query("Content-Type") contentType: String = "text/plain")//"application/zip") + : Observable + } val latestKobaltVersion: Future get() { @@ -179,7 +149,7 @@ public class GithubApi @Inject constructor(val executors: KobaltExecutors) { @Suppress("UNCHECKED_CAST") val reader = BufferedReader(InputStreamReader(ins)) val jo = JsonParser().parse(reader) as JsonArray -// val jo = Parser().parse(ins) as JsonArray + // val jo = Parser().parse(ins) as JsonArray if (jo.size() > 0) { var versionName = (jo.get(0) as JsonObject).get("name").asString if (versionName == null) { @@ -196,4 +166,47 @@ public class GithubApi @Inject constructor(val executors: KobaltExecutors) { } return executors.miscExecutor.submit(callable) } -} \ No newline at end of file +} + +fun Response.bodyContent() : String { + val bodyBytes = (body as TypedByteArray).bytes + val bodyMime = body.mimeType() + val bodyCharset = MimeUtil.parseCharset(bodyMime, "utf-8") + val result = String(bodyBytes, bodyCharset) + return result + // return new Gson().fromJson(data, type); +} + +class Prop { + companion object { + const val ACCESS_TOKEN_PROPERTY = "github.accessToken" + const val USERNAME_PROPERTY = "github.username" + + val localProperties: Properties by lazy { + val result = Properties() + val filePath = Paths.get("local.properties") + if (! Files.exists(filePath)) { + throw KobaltException("Couldn't find a local.properties file") + } + + filePath.let { path -> + if (Files.exists(path)) { + Files.newInputStream(path).use { + result.load(it) + } + } + } + + result + } + + private fun fromProperties(name: String) : String { + val result = localProperties.get(name) + ?: throw KobaltException("Couldn't find $name in local.properties") + return result as String + } + + val accessToken: String get() = fromProperties(ACCESS_TOKEN_PROPERTY) + val username: String get() = fromProperties(USERNAME_PROPERTY) + } +}