1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-26 00:17: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 {
// 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) {

View file

@ -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<Contributor>
@GET("/repos/{owner}/{repo}/releases")
fun releases(@Path("owner") owner: String, @Path("repo") repo: String): List<Release>
@POST("/repos/{owner}/{repo}/releases")
fun createRelease(@Path("owner") owner: String,
@Query("access_token") accessToken: String,
@Path("repo") repo: String,
@Body createRelease: CreateRelease
) : Observable<CreateReleaseResponse>
@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<UploadReleaseResponse>
}
val service : Api by lazy { ServiceGenerator.createService(Api::class.java) }
fun <S> createService(serviceClass: Class<S>): 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<Release>
@POST("/repos/{owner}/{repo}/releases")
fun createRelease(@Path("owner") owner: String,
@Query("access_token") accessToken: String,
@Path("repo") repo: String,
@Body createRelease: CreateRelease
): 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")
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<UploadReleaseResponse>
}
val latestKobaltVersion: Future<String>
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<JsonObject>
// 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) {
@ -196,4 +166,47 @@ public class GithubApi @Inject constructor(val executors: KobaltExecutors) {
}
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 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)
}
}