rust hackin'

This commit is contained in:
Graham Christensen 2017-11-06 12:36:47 -05:00
parent 05ca7f9ce7
commit cb899fd322
No known key found for this signature in database
GPG key ID: ACA1C1D120C83D5C
3 changed files with 97 additions and 22 deletions

View file

@ -7,35 +7,16 @@ use amqp::protocol;
use amqp::Session;
use amqp::Table;
use std::process;
use std::io::Error;
use ofborg::checkout;
use ofborg::worker;
use ofborg::worker::{Actions,StdPr,StdRepo,BuildJob};
fn main() {
println!("Hello, world!");
let cloner = checkout::cached_cloner(Path::new("/home/grahamc/.nix-test-rs"));
let project = cloner.project("NixOS/nixpkgs".to_string(),
"https://github.com/nixos/nixpkgs.git".to_string()
);
let co = project.clone_for("builder".to_string(),
"1234".to_string()).unwrap();
let refpath = co.checkout_ref("origin/master".as_ref());
co.fetch_pr(31228).unwrap();
co.merge_commit("7214d0f6f7a6467205761f87973140727154e1b3".as_ref()).unwrap();
match refpath {
Ok(path) => {
println!("Got path: {:?}", path);
}
Err(wat) => {
println!("Failed to do a checkout of ref : {:?}", wat);
}
}
if false {
let mut session = Session::open_url("amqps://grahamc:cCbKQmwnRcd8kvPW9cjmMSkp@events.nix.gsc.io//").unwrap();
let mut channel = session.open_channel(1).unwrap();
@ -46,6 +27,21 @@ fn main() {
process::exit(1);
}
let cloner = checkout::cached_cloner(Path::new("/home/grahamc/.nix-test-rs"));
channel.basic_consume(
worker::new(BuildWorker{
cloner: cloner
}),
"my_queue_name",
"lmao1",
false,
false,
false,
false,
Table::new()
);
if let Err(result) = channel.basic_publish("", "my_queue_name", true, false,
protocol::basic::BasicProperties{ content_type: Some("text".to_string()), ..Default::default()}, (b"Hello from rust!").to_vec()) {
println!("Failed to publish: {:?}", result);
@ -53,3 +49,30 @@ fn main() {
}
}
}
struct BuildWorker {
cloner: checkout::CachedCloner,
}
impl worker::SimpleWorker for BuildWorker {
fn consumer(&self, job: BuildJob, resp: Actions) -> Result<(), Error> {
let project = self.cloner.project(job.repo.full_name, job.repo.clone_url);
let co = project.clone_for("builder".to_string(),
job.pr.number.to_string())?;
let refpath = co.checkout_ref(job.pr.target_branch.as_ref());
co.fetch_pr(job.pr.number).unwrap();
co.merge_commit(job.pr.head_sha.as_ref()).unwrap();
match refpath {
Ok(path) => {
println!("Got path: {:?}", path);
}
Err(wat) => {
println!("Failed to do a checkout of ref : {:?}", wat);
}
}
return Ok(())
}
}

View file

@ -1,12 +1,15 @@
extern crate amqp;
extern crate fs2;
extern crate md5;
pub mod checkout;
pub mod locks;
pub mod clone;
pub mod worker;
pub mod ofborg {
pub use checkout;
pub use locks;
pub use clone;
pub use worker;
}

49
ofborg/src/worker.rs Normal file
View file

@ -0,0 +1,49 @@
use amqp::{Consumer, Channel};
use amqp::protocol::basic::{Deliver,BasicProperties};
use std::marker::Send;
use std::io::Error;
pub struct Worker<T: SimpleWorker> {
internal: T
}
pub struct StdRepo {
pub full_name: String,
pub clone_url: String,
}
pub struct StdPr {
pub target_branch: String,
pub number: i64,
pub head_sha: String,
}
pub struct BuildJob {
pub repo: StdRepo,
pub pr: StdPr,
}
pub struct Actions {
}
pub trait SimpleWorker {
fn consumer(&self, job: BuildJob, resp: Actions) -> Result<(), Error>;
}
pub fn new<T: SimpleWorker>(worker: T) -> Worker<T> {
return Worker{
internal: worker,
};
}
impl <T: SimpleWorker + Send> Consumer for Worker<T> {
fn handle_delivery(&mut self,
channel: &mut Channel,
method: Deliver,
headers: BasicProperties,
body: Vec<u8>) {
}
}