1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-27 00:38:11 -07:00

Successful upload.

This commit is contained in:
Cedric Beust 2015-11-11 22:33:36 -08:00
parent 779d8d7b8a
commit 49dac2a6b3
2 changed files with 149 additions and 136 deletions

View file

@ -70,6 +70,7 @@ private class Main @Inject constructor(
} }
public fun run(jc: JCommander, args: Args, argv: Array<String>): Int { public fun run(jc: JCommander, args: Args, argv: Array<String>): Int {
// github.uploadRelease()
// //
// Add all the repos from repo contributors (at least those that return values without a Project) // 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 var result = 0
val latestVersionFuture = github.latestKobaltVersion val latestVersionFuture = github.latestKobaltVersion
val seconds = benchmark("build", { val seconds = benchmark("build", {
// runTest()
try { try {
result = runWithArgs(jc, args, argv) result = runWithArgs(jc, args, argv)
} catch(ex: KobaltException) { } catch(ex: KobaltException) {

View file

@ -8,8 +8,13 @@ import com.google.gson.JsonParser
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.squareup.okhttp.OkHttpClient import com.squareup.okhttp.OkHttpClient
import retrofit.RestAdapter import retrofit.RestAdapter
import retrofit.RetrofitError
import retrofit.client.OkClient import retrofit.client.OkClient
import retrofit.client.Response
import retrofit.http.* import retrofit.http.*
import retrofit.mime.MimeUtil
import retrofit.mime.TypedByteArray
import retrofit.mime.TypedFile
import rx.Observable import rx.Observable
import java.io.BufferedReader import java.io.BufferedReader
import java.io.File import java.io.File
@ -28,48 +33,75 @@ import javax.inject.Inject
*/ */
public class GithubApi @Inject constructor(val executors: KobaltExecutors) { public class GithubApi @Inject constructor(val executors: KobaltExecutors) {
companion object { companion object {
const val HOST = const val RELEASES_URL = "https://api.github.com/repos/cbeust/kobalt/releases"
"https://api.github.com"
// "https://developer.github.com/v3/"
const val RELEASES_URL = "$HOST/repos/cbeust/kobalt/releases"
} }
public class ServiceGenerator { fun uploadRelease(): Int {
companion object { val releaseName = "TestRelease"
val API_BASE_URL = HOST val release = service.getReleaseByTagName(Prop.username, "kobalt", releaseName)
val httpClient = OkHttpClient() uploadService.uploadRelease(Prop.username, Prop.accessToken, "kobalt", release.id!!, "zipFile", "label",
val builder = RestAdapter.Builder() TypedFile("text/plain", File(homeDir("kotlin", "kobalt", "kobalt", "src", "Build.kt"))))
.setEndpoint(API_BASE_URL) .subscribe(
// .baseUrl(API_BASE_URL) { println("success") },
// .addConverterFactory(GsonConverterFactory.create()) { e: Throwable ->
println("error" + (e as RetrofitError).response.bodyContent())
class Contributor { println("")
var login: String? = null },
var contributions: Int? = null { println("complete") }
)
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 { class Release {
var name: String? = null var name: String? = null
var prerelease: Boolean? = null var prerelease: Boolean? = null
} }
class UploadReleaseResponse(var id: String? = null)
class CreateRelease(@SerializedName("tag_name") var tag_name: 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) class CreateReleaseResponse(var id: String? = null)
class GetReleaseResponse(var id: String? = null,
@SerializedName("upload_url") var uploadUrl: String? = null)
interface Api { interface Api {
@GET("/repos/{owner}/{repo}/contributors")
fun contributors(@Path("owner") owner: String, @Path("repo") repo: String): List<Contributor> @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") @GET("/repos/{owner}/{repo}/releases")
fun releases(@Path("owner") owner: String, @Path("repo") repo: String): List<Release> fun releases(@Path("owner") owner: String, @Path("repo") repo: String): List<Release>
@ -80,7 +112,22 @@ public class GithubApi @Inject constructor(val executors: KobaltExecutors) {
@Path("repo") repo: String, @Path("repo") repo: String,
@Body createRelease: CreateRelease @Body createRelease: CreateRelease
): Observable<CreateReleaseResponse> ): Observable<CreateReleaseResponse>
}
//
// 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") @POST("/repos/{owner}/{repo}/releases/{id}/assets")
fun uploadRelease(@Path("owner") owner: String, fun uploadRelease(@Path("owner") owner: String,
@Query("access_token") accessToken: String, @Query("access_token") accessToken: String,
@ -88,25 +135,50 @@ public class GithubApi @Inject constructor(val executors: KobaltExecutors) {
@Path("id") id: String, @Path("id") id: String,
@Query("name") name: String, @Query("name") name: String,
@Query("label") label: String, @Query("label") label: String,
@Body file: File, @Body file: TypedFile)
@Query("Content-Type") contentType: String = "application/zip") // @Query("Content-Type") contentType: String = "text/plain")//"application/zip")
: Observable<UploadReleaseResponse> : Observable<UploadReleaseResponse>
} }
val service : Api by lazy { ServiceGenerator.createService(Api::class.java) } val latestKobaltVersion: Future<String>
get() {
fun <S> createService(serviceClass: Class<S>): S { val callable = Callable<String> {
val retrofit = builder var result = "0"
.setEndpoint(HOST) try {
.setLogLevel(RestAdapter.LogLevel.FULL) val ins = URL(RELEASES_URL).openConnection().inputStream
.setClient(OkClient(OkHttpClient())) @Suppress("UNCHECKED_CAST")
val reader = BufferedReader(InputStreamReader(ins))
// .setClient(httpClient) val jo = JsonParser().parse(reader) as JsonArray
.build() // val jo = Parser().parse(ins) as JsonArray<JsonObject>
return retrofit.create(serviceClass) if (jo.size() > 0) {
var versionName = (jo.get(0) as JsonObject).get("name").asString
if (versionName == null) {
versionName = (jo.get(0) as JsonObject).get("tag_name").asString
}
if (versionName != null) {
result = versionName
}
}
} catch(ex: IOException) {
warn("Couldn't load the release URL: $RELEASES_URL")
}
result
}
return executors.miscExecutor.submit(callable)
}
} }
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 ACCESS_TOKEN_PROPERTY = "github.accessToken"
const val USERNAME_PROPERTY = "github.username" const val USERNAME_PROPERTY = "github.username"
@ -136,64 +208,5 @@ public class GithubApi @Inject constructor(val executors: KobaltExecutors) {
val accessToken: String get() = fromProperties(ACCESS_TOKEN_PROPERTY) val accessToken: String get() = fromProperties(ACCESS_TOKEN_PROPERTY)
val username: String get() = fromProperties(USERNAME_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)
}
.subscribe(
{ println("success") },
{ e: Throwable -> println("error" + e)},
{ 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")))
}
}
}
val latestKobaltVersion: Future<String>
get() {
val callable = Callable<String> {
var result = "0"
try {
val ins = URL(RELEASES_URL).openConnection().inputStream
@Suppress("UNCHECKED_CAST")
val reader = BufferedReader(InputStreamReader(ins))
val jo = JsonParser().parse(reader) as JsonArray
// val jo = Parser().parse(ins) as JsonArray<JsonObject>
if (jo.size() > 0) {
var versionName = (jo.get(0) as JsonObject).get("name").asString
if (versionName == null) {
versionName = (jo.get(0) as JsonObject).get("tag_name").asString
}
if (versionName != null) {
result = versionName
}
}
} catch(ex: IOException) {
warn("Couldn't load the release URL: $RELEASES_URL")
}
result
}
return executors.miscExecutor.submit(callable)
} }
} }