about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-09-27 20:18:50 -0700
committerAlex Crichton <alex@alexcrichton.com>2013-09-30 23:21:18 -0700
commit7e709bfd0dac1d5bbe5c97494980731b4d477e8f (patch)
treee0d7b54aed7492e51c5944badf590385a19232ae
parenta8ba31dbf3e7d80a069bc486a35eff8357282b68 (diff)
downloadrust-7e709bfd0dac1d5bbe5c97494980731b4d477e8f.tar.gz
rust-7e709bfd0dac1d5bbe5c97494980731b4d477e8f.zip
extra: Remove usage of fmt!
-rw-r--r--src/libextra/arc.rs10
-rw-r--r--src/libextra/arena.rs8
-rw-r--r--src/libextra/base64.rs6
-rw-r--r--src/libextra/bitv.rs6
-rw-r--r--src/libextra/comm.rs6
-rw-r--r--src/libextra/crypto/cryptoutil.rs14
-rw-r--r--src/libextra/dlist.rs4
-rw-r--r--src/libextra/ebml.rs87
-rw-r--r--src/libextra/fileinput.rs32
-rw-r--r--src/libextra/flate.rs4
-rw-r--r--src/libextra/flatpipes.rs26
-rw-r--r--src/libextra/future.rs8
-rw-r--r--src/libextra/getopts.rs124
-rw-r--r--src/libextra/glob.rs4
-rw-r--r--src/libextra/hex.rs10
-rw-r--r--src/libextra/json.rs68
-rw-r--r--src/libextra/list.rs4
-rw-r--r--src/libextra/num/bigint.rs18
-rw-r--r--src/libextra/num/complex.rs8
-rw-r--r--src/libextra/num/rational.rs6
-rw-r--r--src/libextra/ringbuf.rs24
-rw-r--r--src/libextra/semver.rs10
-rw-r--r--src/libextra/smallintmap.rs2
-rw-r--r--src/libextra/sort.rs20
-rw-r--r--src/libextra/stats.rs12
-rw-r--r--src/libextra/sync.rs22
-rw-r--r--src/libextra/term.rs12
-rw-r--r--src/libextra/terminfo/parm.rs22
-rw-r--r--src/libextra/terminfo/parser/compiled.rs37
-rw-r--r--src/libextra/terminfo/searcher.rs4
-rw-r--r--src/libextra/test.rs66
-rw-r--r--src/libextra/time.rs76
-rw-r--r--src/libextra/treemap.rs4
-rw-r--r--src/libextra/url.rs22
-rw-r--r--src/libextra/uuid.rs31
-rw-r--r--src/libextra/workcache.rs28
36 files changed, 424 insertions, 421 deletions
diff --git a/src/libextra/arc.rs b/src/libextra/arc.rs
index be55af697c6..40ddea53895 100644
--- a/src/libextra/arc.rs
+++ b/src/libextra/arc.rs
@@ -255,7 +255,7 @@ impl<T:Send> MutexArc<T> {
         let inner = x.unwrap();
         let MutexArcInner { failed: failed, data: data, _ } = inner;
         if failed {
-            fail!(~"Can't unwrap poisoned MutexArc - another task failed inside!");
+            fail2!("Can't unwrap poisoned MutexArc - another task failed inside!");
         }
         data
     }
@@ -300,9 +300,9 @@ impl<T:Freeze + Send> MutexArc<T> {
 fn check_poison(is_mutex: bool, failed: bool) {
     if failed {
         if is_mutex {
-            fail!("Poisoned MutexArc - another task failed inside!");
+            fail2!("Poisoned MutexArc - another task failed inside!");
         } else {
-            fail!("Poisoned rw_arc - another task failed inside!");
+            fail2!("Poisoned rw_arc - another task failed inside!");
         }
     }
 }
@@ -505,7 +505,7 @@ impl<T:Freeze + Send> RWArc<T> {
         let inner = x.unwrap();
         let RWArcInner { failed: failed, data: data, _ } = inner;
         if failed {
-            fail!(~"Can't unwrap poisoned RWArc - another task failed inside!")
+            fail2!(~"Can't unwrap poisoned RWArc - another task failed inside!")
         }
         data
     }
@@ -619,7 +619,7 @@ mod tests {
         assert_eq!(arc_v.get()[2], 3);
         assert_eq!(arc_v.get()[4], 5);
 
-        info!(arc_v);
+        info2!("{:?}", arc_v);
     }
 
     #[test]
diff --git a/src/libextra/arena.rs b/src/libextra/arena.rs
index 63c8e2010b0..520faad1afa 100644
--- a/src/libextra/arena.rs
+++ b/src/libextra/arena.rs
@@ -127,7 +127,7 @@ unsafe fn destroy_chunk(chunk: &Chunk) {
 
         let start = round_up_to(after_tydesc, align);
 
-        //debug!("freeing object: idx = %u, size = %u, align = %u, done = %b",
+        //debug2!("freeing object: idx = {}, size = {}, align = {}, done = {}",
         //       start, size, align, is_done);
         if is_done {
             ((*tydesc).drop_glue)(ptr::offset(buf, start as int) as *i8);
@@ -176,7 +176,7 @@ impl Arena {
             }
             this.pod_head.fill = end;
 
-            //debug!("idx = %u, size = %u, align = %u, fill = %u",
+            //debug2!("idx = {}, size = {}, align = {}, fill = {}",
             //       start, n_bytes, align, head.fill);
 
             ptr::offset(vec::raw::to_ptr(this.pod_head.data), start as int)
@@ -232,7 +232,7 @@ impl Arena {
             let head = transmute_mut_region(&mut self.head);
             head.fill = round_up_to(end, sys::pref_align_of::<*TyDesc>());
 
-            //debug!("idx = %u, size = %u, align = %u, fill = %u",
+            //debug2!("idx = {}, size = {}, align = {}, fill = {}",
             //       start, n_bytes, align, head.fill);
 
             let buf = vec::raw::to_ptr(self.head.data);
@@ -305,6 +305,6 @@ fn test_arena_destructors_fail() {
     // Now, fail while allocating
     do arena.alloc::<@int> {
         // Now fail.
-        fail!();
+        fail2!();
     };
 }
diff --git a/src/libextra/base64.rs b/src/libextra/base64.rs
index 730f92d953b..ed366047c84 100644
--- a/src/libextra/base64.rs
+++ b/src/libextra/base64.rs
@@ -141,7 +141,7 @@ impl<'self> ToBase64 for &'self [u8] {
                     v.push('=' as u8);
                 }
             }
-            _ => fail!("Algebra is broken, please alert the math police")
+            _ => fail2!("Algebra is broken, please alert the math police")
         }
 
         unsafe {
@@ -202,7 +202,7 @@ impl<'self> FromBase64 for &'self str {
                 '/'|'_' => buf |= 0x3F,
                 '\r'|'\n' => loop,
                 '=' => break,
-                _ => return Err(fmt!("Invalid character '%c' at position %u",
+                _ => return Err(format!("Invalid character '{}' at position {}",
                                      self.char_at(idx), idx))
             }
 
@@ -218,7 +218,7 @@ impl<'self> FromBase64 for &'self str {
 
         for (idx, byte) in it {
             if (byte as char) != '=' {
-                return Err(fmt!("Invalid character '%c' at position %u",
+                return Err(format!("Invalid character '{}' at position {}",
                                 self.char_at(idx), idx));
             }
         }
diff --git a/src/libextra/bitv.rs b/src/libextra/bitv.rs
index a24f3521fea..49a38a00b10 100644
--- a/src/libextra/bitv.rs
+++ b/src/libextra/bitv.rs
@@ -232,7 +232,7 @@ pub struct Bitv {
 }
 
 fn die() -> ! {
-    fail!("Tried to do operation on bit vectors with different sizes");
+    fail2!("Tried to do operation on bit vectors with different sizes");
 }
 
 impl Bitv {
@@ -1357,7 +1357,7 @@ mod tests {
         let mut b = Bitv::new(14, true);
         b.clear();
         do b.ones |i| {
-            fail!("found 1 at %?", i)
+            fail2!("found 1 at {:?}", i)
         };
     }
 
@@ -1366,7 +1366,7 @@ mod tests {
         let mut b = Bitv::new(140, true);
         b.clear();
         do b.ones |i| {
-            fail!("found 1 at %?", i)
+            fail2!("found 1 at {:?}", i)
         };
     }
 
diff --git a/src/libextra/comm.rs b/src/libextra/comm.rs
index dc6f4964b31..476755919a4 100644
--- a/src/libextra/comm.rs
+++ b/src/libextra/comm.rs
@@ -179,7 +179,7 @@ mod test {
         let (port, chan) = rendezvous();
         do spawn_unlinked {
             chan.duplex_stream.send(()); // Can't access this field outside this module
-            fail!()
+            fail2!()
         }
         port.recv()
     }
@@ -189,7 +189,7 @@ mod test {
         let (port, chan) = rendezvous();
         do spawn_unlinked {
             port.duplex_stream.recv();
-            fail!()
+            fail2!()
         }
         chan.try_send(());
     }
@@ -200,7 +200,7 @@ mod test {
         let (port, chan) = rendezvous();
         do spawn_unlinked {
             port.duplex_stream.recv();
-            fail!()
+            fail2!()
         }
         chan.send(());
     }
diff --git a/src/libextra/crypto/cryptoutil.rs b/src/libextra/crypto/cryptoutil.rs
index 3573bb55948..8c97f7db2bd 100644
--- a/src/libextra/crypto/cryptoutil.rs
+++ b/src/libextra/crypto/cryptoutil.rs
@@ -109,23 +109,23 @@ impl ToBits for u64 {
     }
 }
 
-/// Adds the specified number of bytes to the bit count. fail!() if this would cause numeric
+/// Adds the specified number of bytes to the bit count. fail2!() if this would cause numeric
 /// overflow.
 pub fn add_bytes_to_bits<T: Int + CheckedAdd + ToBits>(bits: T, bytes: T) -> T {
     let (new_high_bits, new_low_bits) = bytes.to_bits();
 
     if new_high_bits > Zero::zero() {
-        fail!("Numeric overflow occured.")
+        fail2!("Numeric overflow occured.")
     }
 
     match bits.checked_add(&new_low_bits) {
         Some(x) => return x,
-        None => fail!("Numeric overflow occured.")
+        None => fail2!("Numeric overflow occured.")
     }
 }
 
 /// Adds the specified number of bytes to the bit count, which is a tuple where the first element is
-/// the high order value. fail!() if this would cause numeric overflow.
+/// the high order value. fail2!() if this would cause numeric overflow.
 pub fn add_bytes_to_bits_tuple
         <T: Int + Unsigned + CheckedAdd + ToBits>
         (bits: (T, T), bytes: T) -> (T, T) {
@@ -144,7 +144,7 @@ pub fn add_bytes_to_bits_tuple
             } else {
                 match hi.checked_add(&new_high_bits) {
                     Some(y) => return (y, x),
-                    None => fail!("Numeric overflow occured.")
+                    None => fail2!("Numeric overflow occured.")
                 }
             }
         },
@@ -152,7 +152,7 @@ pub fn add_bytes_to_bits_tuple
             let one: T = One::one();
             let z = match new_high_bits.checked_add(&one) {
                 Some(w) => w,
-                None => fail!("Numeric overflow occured.")
+                None => fail2!("Numeric overflow occured.")
             };
             match hi.checked_add(&z) {
                 // This re-executes the addition that was already performed earlier when overflow
@@ -163,7 +163,7 @@ pub fn add_bytes_to_bits_tuple
                 // be Unsigned - overflow is not defined for Signed types. This function could be
                 // implemented for signed types as well if that were needed.
                 Some(y) => return (y, low + new_low_bits),
-                None => fail!("Numeric overflow occured.")
+                None => fail2!("Numeric overflow occured.")
             }
         }
     }
diff --git a/src/libextra/dlist.rs b/src/libextra/dlist.rs
index da5d5d00e80..bf91c5c5d7e 100644
--- a/src/libextra/dlist.rs
+++ b/src/libextra/dlist.rs
@@ -632,11 +632,11 @@ pub fn check_links<T>(list: &DList<T>) {
     loop {
         match (last_ptr, node_ptr.prev.resolve_immut()) {
             (None   , None      ) => {}
-            (None   , _         ) => fail!("prev link for list_head"),
+            (None   , _         ) => fail2!("prev link for list_head"),
             (Some(p), Some(pptr)) => {
                 assert_eq!(p as *Node<T>, pptr as *Node<T>);
             }
-            _ => fail!("prev link is none, not good"),
+            _ => fail2!("prev link is none, not good"),
         }
         match node_ptr.next {
             Some(ref next) => {
diff --git a/src/libextra/ebml.rs b/src/libextra/ebml.rs
index 4e5094dab63..8cba1a417d0 100644
--- a/src/libextra/ebml.rs
+++ b/src/libextra/ebml.rs
@@ -138,7 +138,7 @@ pub mod reader {
                         (data[start + 3u] as uint),
                     next: start + 4u};
         }
-        fail!("vint too big");
+        fail2!("vint too big");
     }
 
     #[cfg(target_arch = "x86")]
@@ -216,8 +216,8 @@ pub mod reader {
         match maybe_get_doc(d, tg) {
             Some(d) => d,
             None => {
-                error!("failed to find block with tag %u", tg);
-                fail!();
+                error2!("failed to find block with tag {}", tg);
+                fail2!();
             }
         }
     }
@@ -305,20 +305,20 @@ pub mod reader {
                     self.pos = r_doc.end;
                     let str = r_doc.as_str_slice();
                     if lbl != str {
-                        fail!("Expected label %s but found %s", lbl, str);
+                        fail2!("Expected label {} but found {}", lbl, str);
                     }
                 }
             }
         }
 
         fn next_doc(&mut self, exp_tag: EbmlEncoderTag) -> Doc {
-            debug!(". next_doc(exp_tag=%?)", exp_tag);
+            debug2!(". next_doc(exp_tag={:?})", exp_tag);
             if self.pos >= self.parent.end {
-                fail!("no more documents in current node!");
+                fail2!("no more documents in current node!");
             }
             let TaggedDoc { tag: r_tag, doc: r_doc } =
                 doc_at(self.parent.data, self.pos);
-            debug!("self.parent=%?-%? self.pos=%? r_tag=%? r_doc=%?-%?",
+            debug2!("self.parent={}-{} self.pos={} r_tag={} r_doc={}-{}",
                    self.parent.start,
                    self.parent.end,
                    self.pos,
@@ -326,10 +326,11 @@ pub mod reader {
                    r_doc.start,
                    r_doc.end);
             if r_tag != (exp_tag as uint) {
-                fail!("expected EBML doc with tag %? but found tag %?", exp_tag, r_tag);
+                fail2!("expected EBML doc with tag {:?} but found tag {:?}",
+                       exp_tag, r_tag);
             }
             if r_doc.end > self.parent.end {
-                fail!("invalid EBML, child extends to 0x%x, parent to 0x%x",
+                fail2!("invalid EBML, child extends to {:#x}, parent to {:#x}",
                       r_doc.end, self.parent.end);
             }
             self.pos = r_doc.end;
@@ -351,7 +352,7 @@ pub mod reader {
 
         fn _next_uint(&mut self, exp_tag: EbmlEncoderTag) -> uint {
             let r = doc_as_u32(self.next_doc(exp_tag));
-            debug!("_next_uint exp_tag=%? result=%?", exp_tag, r);
+            debug2!("_next_uint exp_tag={:?} result={}", exp_tag, r);
             r as uint
         }
     }
@@ -383,7 +384,7 @@ pub mod reader {
         fn read_uint(&mut self) -> uint {
             let v = doc_as_u64(self.next_doc(EsUint));
             if v > (::std::uint::max_value as u64) {
-                fail!("uint %? too large for this architecture", v);
+                fail2!("uint {} too large for this architecture", v);
             }
             v as uint
         }
@@ -403,8 +404,8 @@ pub mod reader {
         fn read_int(&mut self) -> int {
             let v = doc_as_u64(self.next_doc(EsInt)) as i64;
             if v > (int::max_value as i64) || v < (int::min_value as i64) {
-                debug!("FIXME #6122: Removing this makes this function miscompile");
-                fail!("int %? out of range for this architecture", v);
+                debug2!("FIXME \\#6122: Removing this makes this function miscompile");
+                fail2!("int {} out of range for this architecture", v);
             }
             v as int
         }
@@ -437,7 +438,7 @@ pub mod reader {
                         name: &str,
                         f: &fn(&mut Decoder) -> T)
                         -> T {
-            debug!("read_enum(%s)", name);
+            debug2!("read_enum({})", name);
             self._check_label(name);
 
             let doc = self.next_doc(EsEnum);
@@ -457,9 +458,9 @@ pub mod reader {
                                 _: &[&str],
                                 f: &fn(&mut Decoder, uint) -> T)
                                 -> T {
-            debug!("read_enum_variant()");
+            debug2!("read_enum_variant()");
             let idx = self._next_uint(EsEnumVid);
-            debug!("  idx=%u", idx);
+            debug2!("  idx={}", idx);
 
             let doc = self.next_doc(EsEnumBody);
 
@@ -477,7 +478,7 @@ pub mod reader {
         fn read_enum_variant_arg<T>(&mut self,
                                     idx: uint,
                                     f: &fn(&mut Decoder) -> T) -> T {
-            debug!("read_enum_variant_arg(idx=%u)", idx);
+            debug2!("read_enum_variant_arg(idx={})", idx);
             f(self)
         }
 
@@ -485,9 +486,9 @@ pub mod reader {
                                        _: &[&str],
                                        f: &fn(&mut Decoder, uint) -> T)
                                        -> T {
-            debug!("read_enum_struct_variant()");
+            debug2!("read_enum_struct_variant()");
             let idx = self._next_uint(EsEnumVid);
-            debug!("  idx=%u", idx);
+            debug2!("  idx={}", idx);
 
             let doc = self.next_doc(EsEnumBody);
 
@@ -507,7 +508,7 @@ pub mod reader {
                                              idx: uint,
                                              f: &fn(&mut Decoder) -> T)
                                              -> T {
-            debug!("read_enum_struct_variant_arg(name=%?, idx=%u)", name, idx);
+            debug2!("read_enum_struct_variant_arg(name={}, idx={})", name, idx);
             f(self)
         }
 
@@ -516,7 +517,7 @@ pub mod reader {
                           _: uint,
                           f: &fn(&mut Decoder) -> T)
                           -> T {
-            debug!("read_struct(name=%s)", name);
+            debug2!("read_struct(name={})", name);
             f(self)
         }
 
@@ -525,19 +526,19 @@ pub mod reader {
                                 idx: uint,
                                 f: &fn(&mut Decoder) -> T)
                                 -> T {
-            debug!("read_struct_field(name=%?, idx=%u)", name, idx);
+            debug2!("read_struct_field(name={}, idx={})", name, idx);
             self._check_label(name);
             f(self)
         }
 
         fn read_tuple<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
-            debug!("read_tuple()");
+            debug2!("read_tuple()");
             self.read_seq(f)
         }
 
         fn read_tuple_arg<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T)
                              -> T {
-            debug!("read_tuple_arg(idx=%u)", idx);
+            debug2!("read_tuple_arg(idx={})", idx);
             self.read_seq_elt(idx, f)
         }
 
@@ -545,7 +546,7 @@ pub mod reader {
                                 name: &str,
                                 f: &fn(&mut Decoder, uint) -> T)
                                 -> T {
-            debug!("read_tuple_struct(name=%?)", name);
+            debug2!("read_tuple_struct(name={})", name);
             self.read_tuple(f)
         }
 
@@ -553,43 +554,43 @@ pub mod reader {
                                     idx: uint,
                                     f: &fn(&mut Decoder) -> T)
                                     -> T {
-            debug!("read_tuple_struct_arg(idx=%u)", idx);
+            debug2!("read_tuple_struct_arg(idx={})", idx);
             self.read_tuple_arg(idx, f)
         }
 
         fn read_option<T>(&mut self, f: &fn(&mut Decoder, bool) -> T) -> T {
-            debug!("read_option()");
+            debug2!("read_option()");
             do self.read_enum("Option") |this| {
                 do this.read_enum_variant(["None", "Some"]) |this, idx| {
                     match idx {
                         0 => f(this, false),
                         1 => f(this, true),
-                        _ => fail!(),
+                        _ => fail2!(),
                     }
                 }
             }
         }
 
         fn read_seq<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
-            debug!("read_seq()");
+            debug2!("read_seq()");
             do self.push_doc(EsVec) |d| {
                 let len = d._next_uint(EsVecLen);
-                debug!("  len=%u", len);
+                debug2!("  len={}", len);
                 f(d, len)
             }
         }
 
         fn read_seq_elt<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T)
                            -> T {
-            debug!("read_seq_elt(idx=%u)", idx);
+            debug2!("read_seq_elt(idx={})", idx);
             self.push_doc(EsVecElt, f)
         }
 
         fn read_map<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
-            debug!("read_map()");
+            debug2!("read_map()");
             do self.push_doc(EsMap) |d| {
                 let len = d._next_uint(EsMapLen);
-                debug!("  len=%u", len);
+                debug2!("  len={}", len);
                 f(d, len)
             }
         }
@@ -598,7 +599,7 @@ pub mod reader {
                                idx: uint,
                                f: &fn(&mut Decoder) -> T)
                                -> T {
-            debug!("read_map_elt_key(idx=%u)", idx);
+            debug2!("read_map_elt_key(idx={})", idx);
             self.push_doc(EsMapKey, f)
         }
 
@@ -606,7 +607,7 @@ pub mod reader {
                                idx: uint,
                                f: &fn(&mut Decoder) -> T)
                                -> T {
-            debug!("read_map_elt_val(idx=%u)", idx);
+            debug2!("read_map_elt_val(idx={})", idx);
             self.push_doc(EsMapVal, f)
         }
     }
@@ -642,7 +643,7 @@ pub mod writer {
                             n as u8]),
             4u => w.write(&[0x10u8 | ((n >> 24_u) as u8), (n >> 16_u) as u8,
                             (n >> 8_u) as u8, n as u8]),
-            _ => fail!("vint to write too big: %?", n)
+            _ => fail2!("vint to write too big: {}", n)
         };
     }
 
@@ -651,7 +652,7 @@ pub mod writer {
         if n < 0x4000_u { write_sized_vuint(w, n, 2u); return; }
         if n < 0x200000_u { write_sized_vuint(w, n, 3u); return; }
         if n < 0x10000000_u { write_sized_vuint(w, n, 4u); return; }
-        fail!("vint to write too big: %?", n);
+        fail2!("vint to write too big: {}", n);
     }
 
     pub fn Encoder(w: @io::Writer) -> Encoder {
@@ -665,7 +666,7 @@ pub mod writer {
     // FIXME (#2741): Provide a function to write the standard ebml header.
     impl Encoder {
         pub fn start_tag(&mut self, tag_id: uint) {
-            debug!("Start tag %u", tag_id);
+            debug2!("Start tag {}", tag_id);
 
             // Write the enum ID:
             write_vuint(self.writer, tag_id);
@@ -684,7 +685,7 @@ pub mod writer {
             write_sized_vuint(self.writer, size, 4u);
             self.writer.seek(cur_pos as int, io::SeekSet);
 
-            debug!("End tag (size = %u)", size);
+            debug2!("End tag (size = {})", size);
         }
 
         pub fn wr_tag(&mut self, tag_id: uint, blk: &fn()) {
@@ -748,12 +749,12 @@ pub mod writer {
         }
 
         pub fn wr_bytes(&mut self, b: &[u8]) {
-            debug!("Write %u bytes", b.len());
+            debug2!("Write {} bytes", b.len());
             self.writer.write(b);
         }
 
         pub fn wr_str(&mut self, s: &str) {
-            debug!("Write str: %?", s);
+            debug2!("Write str: {}", s);
             self.writer.write(s.as_bytes());
         }
     }
@@ -977,7 +978,7 @@ mod tests {
     #[test]
     fn test_option_int() {
         fn test_v(v: Option<int>) {
-            debug!("v == %?", v);
+            debug2!("v == {:?}", v);
             let bytes = do io::with_bytes_writer |wr| {
                 let mut ebml_w = writer::Encoder(wr);
                 v.encode(&mut ebml_w)
@@ -985,7 +986,7 @@ mod tests {
             let ebml_doc = reader::Doc(@bytes);
             let mut deser = reader::Decoder(ebml_doc);
             let v1 = serialize::Decodable::decode(&mut deser);
-            debug!("v1 == %?", v1);
+            debug2!("v1 == {:?}", v1);
             assert_eq!(v, v1);
         }
 
diff --git a/src/libextra/fileinput.rs b/src/libextra/fileinput.rs
index 3ce58b58db6..37bcb447f08 100644
--- a/src/libextra/fileinput.rs
+++ b/src/libextra/fileinput.rs
@@ -43,7 +43,7 @@ to handle any `FileInput` structs. E.g. a simple `cat` program
 or a program that numbers lines after concatenating two files
 
     for input_vec_state(make_path_option_vec([~"a.txt", ~"b.txt"])) |line, state| {
-        io::println(fmt!("%u: %s", state.line_num,
+        io::println(format!("{}: %s", state.line_num,
                                    line));
     }
 
@@ -88,7 +88,7 @@ total line count).
         input.next_file(); // skip!
 
         for input.each_line_state |line, state| {
-           io::println(fmt!("%u: %s", state.line_num_file,
+           io::println(format!("{}: %s", state.line_num_file,
                                       line))
         }
     }
@@ -449,11 +449,11 @@ mod test {
     fn test_fileinput_read_byte() {
         let filenames = make_path_option_vec(vec::from_fn(
             3,
-            |i| fmt!("tmp/lib-fileinput-test-fileinput-read-byte-%u.tmp", i)), true);
+            |i| format!("tmp/lib-fileinput-test-fileinput-read-byte-{}.tmp", i)), true);
 
         // 3 files containing 0\n, 1\n, and 2\n respectively
         for (i, filename) in filenames.iter().enumerate() {
-            make_file(filename.get_ref(), [fmt!("%u", i)]);
+            make_file(filename.get_ref(), [format!("{}", i)]);
         }
 
         let fi = FileInput::from_vec(filenames.clone());
@@ -479,11 +479,11 @@ mod test {
     fn test_fileinput_read() {
         let filenames = make_path_option_vec(vec::from_fn(
             3,
-            |i| fmt!("tmp/lib-fileinput-test-fileinput-read-%u.tmp", i)), true);
+            |i| format!("tmp/lib-fileinput-test-fileinput-read-{}.tmp", i)), true);
 
         // 3 files containing 1\n, 2\n, and 3\n respectively
         for (i, filename) in filenames.iter().enumerate() {
-            make_file(filename.get_ref(), [fmt!("%u", i)]);
+            make_file(filename.get_ref(), [format!("{}", i)]);
         }
 
         let fi = FileInput::from_vec(filenames);
@@ -500,13 +500,13 @@ mod test {
         let mut all_lines = ~[];
         let filenames = make_path_option_vec(vec::from_fn(
             3,
-            |i| fmt!("tmp/lib-fileinput-test-input-vec-%u.tmp", i)), true);
+            |i| format!("tmp/lib-fileinput-test-input-vec-{}.tmp", i)), true);
 
         for (i, filename) in filenames.iter().enumerate() {
             let contents =
-                vec::from_fn(3, |j| fmt!("%u %u", i, j));
+                vec::from_fn(3, |j| format!("{} {}", i, j));
             make_file(filename.get_ref(), contents);
-            debug!("contents=%?", contents);
+            debug2!("contents={:?}", contents);
             all_lines.push_all(contents);
         }
 
@@ -522,11 +522,11 @@ mod test {
     fn test_input_vec_state() {
         let filenames = make_path_option_vec(vec::from_fn(
             3,
-            |i| fmt!("tmp/lib-fileinput-test-input-vec-state-%u.tmp", i)),true);
+            |i| format!("tmp/lib-fileinput-test-input-vec-state-{}.tmp", i)),true);
 
         for (i, filename) in filenames.iter().enumerate() {
             let contents =
-                vec::from_fn(3, |j| fmt!("%u %u", i, j + 1));
+                vec::from_fn(3, |j| format!("{} {}", i, j + 1));
             make_file(filename.get_ref(), contents);
         }
 
@@ -544,7 +544,7 @@ mod test {
     fn test_empty_files() {
         let filenames = make_path_option_vec(vec::from_fn(
             3,
-            |i| fmt!("tmp/lib-fileinput-test-empty-files-%u.tmp", i)),true);
+            |i| format!("tmp/lib-fileinput-test-empty-files-{}.tmp", i)),true);
 
         make_file(filenames[0].get_ref(), [~"1", ~"2"]);
         make_file(filenames[1].get_ref(), []);
@@ -555,7 +555,7 @@ mod test {
             let expected_path = match line {
                 "1" | "2" => filenames[0].clone(),
                 "3" | "4" => filenames[2].clone(),
-                _ => fail!("unexpected line")
+                _ => fail2!("unexpected line")
             };
             assert_eq!(state.current_path.clone(), expected_path);
             count += 1;
@@ -593,11 +593,11 @@ mod test {
     fn test_next_file() {
         let filenames = make_path_option_vec(vec::from_fn(
             3,
-            |i| fmt!("tmp/lib-fileinput-test-next-file-%u.tmp", i)),true);
+            |i| format!("tmp/lib-fileinput-test-next-file-{}.tmp", i)),true);
 
         for (i, filename) in filenames.iter().enumerate() {
             let contents =
-                vec::from_fn(3, |j| fmt!("%u %u", i, j + 1));
+                vec::from_fn(3, |j| format!("{} {}", i, j + 1));
             make_file(filename.get_ref(), contents);
         }
 
@@ -609,7 +609,7 @@ mod test {
 
         // read all lines from 1 (but don't read any from 2),
         for i in range(1u, 4) {
-            assert_eq!(input.read_line(), fmt!("1 %u", i));
+            assert_eq!(input.read_line(), format!("1 {}", i));
         }
         // 1 is finished, but 2 hasn't been started yet, so this will
         // just "skip" to the beginning of 2 (Python's fileinput does
diff --git a/src/libextra/flate.rs b/src/libextra/flate.rs
index e12ac276482..616c7522a48 100644
--- a/src/libextra/flate.rs
+++ b/src/libextra/flate.rs
@@ -121,11 +121,11 @@ mod tests {
             do 2000.times {
                 input.push_all(r.choose(words));
             }
-            debug!("de/inflate of %u bytes of random word-sequences",
+            debug2!("de/inflate of {} bytes of random word-sequences",
                    input.len());
             let cmp = deflate_bytes(input);
             let out = inflate_bytes(cmp);
-            debug!("%u bytes deflated to %u (%.1f%% size)",
+            debug2!("{} bytes deflated to {} ({:.1f}% size)",
                    input.len(), cmp.len(),
                    100.0 * ((cmp.len() as float) / (input.len() as float)));
             assert_eq!(input, out);
diff --git a/src/libextra/flatpipes.rs b/src/libextra/flatpipes.rs
index 886a28ac979..1fd81626188 100644
--- a/src/libextra/flatpipes.rs
+++ b/src/libextra/flatpipes.rs
@@ -261,14 +261,14 @@ impl<T,U:Unflattener<T>,P:BytePort> GenericPort<T> for FlatPort<T, U, P> {
     fn recv(&self) -> T {
         match self.try_recv() {
             Some(val) => val,
-            None => fail!("port is closed")
+            None => fail2!("port is closed")
         }
     }
     fn try_recv(&self) -> Option<T> {
         let command = match self.byte_port.try_recv(CONTINUE.len()) {
             Some(c) => c,
             None => {
-                warn!("flatpipe: broken pipe");
+                warn2!("flatpipe: broken pipe");
                 return None;
             }
         };
@@ -279,7 +279,7 @@ impl<T,U:Unflattener<T>,P:BytePort> GenericPort<T> for FlatPort<T, U, P> {
                     io::u64_from_be_bytes(bytes, 0, size_of::<u64>())
                 },
                 None => {
-                    warn!("flatpipe: broken pipe");
+                    warn2!("flatpipe: broken pipe");
                     return None;
                 }
             };
@@ -291,13 +291,13 @@ impl<T,U:Unflattener<T>,P:BytePort> GenericPort<T> for FlatPort<T, U, P> {
                     Some(self.unflattener.unflatten(bytes))
                 }
                 None => {
-                    warn!("flatpipe: broken pipe");
+                    warn2!("flatpipe: broken pipe");
                     return None;
                 }
             }
         }
         else {
-            fail!("flatpipe: unrecognized command");
+            fail2!("flatpipe: unrecognized command");
         }
     }
 }
@@ -477,7 +477,7 @@ pub mod flatteners {
                 Ok(json) => {
                     json::Decoder(json)
                 }
-                Err(e) => fail!("flatpipe: can't parse json: %?", e)
+                Err(e) => fail2!("flatpipe: can't parse json: {:?}", e)
             }
         }
     }
@@ -536,7 +536,7 @@ pub mod bytepipes {
             if left == 0 {
                 return Some(bytes);
             } else {
-                warn!("flatpipe: dropped %? broken bytes", left);
+                warn2!("flatpipe: dropped {} broken bytes", left);
                 return None;
             }
         }
@@ -797,7 +797,7 @@ mod test {
             let listen_res = do tcp::listen(
                 addr.clone(), port, 128, iotask, |_kill_ch| {
                     // Tell the sender to initiate the connection
-                    debug!("listening");
+                    debug2!("listening");
                     begin_connect_chan.send(())
                 }) |new_conn, kill_ch| {
 
@@ -820,7 +820,7 @@ mod test {
             // Wait for the server to start listening
             begin_connect_port.recv();
 
-            debug!("connecting");
+            debug2!("connecting");
             let iotask = &uv::global_loop::get();
             let connect_result = tcp::connect(addr.clone(), port, iotask);
             assert!(connect_result.is_ok());
@@ -831,7 +831,7 @@ mod test {
             let chan = writer_chan(socket_buf);
 
             for i in range(0, 10) {
-                debug!("sending %?", i);
+                debug2!("sending {}", i);
                 chan.send(i)
             }
         }
@@ -841,9 +841,9 @@ mod test {
             // Wait for a connection
             let (conn, res_chan) = accept_port.recv();
 
-            debug!("accepting connection");
+            debug2!("accepting connection");
             let accept_result = tcp::accept(conn);
-            debug!("accepted");
+            debug2!("accepted");
             assert!(accept_result.is_ok());
             let sock = result::unwrap(accept_result);
             res_chan.send(());
@@ -855,7 +855,7 @@ mod test {
 
             for i in range(0, 10) {
                 let j = port.recv();
-                debug!("received %?", j);
+                debug2!("received {:?}", j);
                 assert_eq!(i, j);
             }
 
diff --git a/src/libextra/future.rs b/src/libextra/future.rs
index fdb296e5f40..516a34f5312 100644
--- a/src/libextra/future.rs
+++ b/src/libextra/future.rs
@@ -57,7 +57,7 @@ impl<A> Future<A> {
         let state = replace(&mut this.state, Evaluating);
         match state {
             Forced(v) => v,
-            _ => fail!( "Logic error." ),
+            _ => fail2!( "Logic error." ),
         }
     }
 
@@ -69,10 +69,10 @@ impl<A> Future<A> {
         */
         match self.state {
             Forced(ref v) => return v,
-            Evaluating => fail!("Recursive forcing of future!"),
+            Evaluating => fail2!("Recursive forcing of future!"),
             Pending(_) => {
                 match replace(&mut self.state, Evaluating) {
-                    Forced(_) | Evaluating => fail!("Logic error."),
+                    Forced(_) | Evaluating => fail2!("Logic error."),
                     Pending(f) => {
                         self.state = Forced(f());
                         self.get_ref()
@@ -217,7 +217,7 @@ mod test {
     #[test]
     #[should_fail]
     fn test_futurefail() {
-        let mut f = Future::spawn(|| fail!());
+        let mut f = Future::spawn(|| fail2!());
         let _x: ~str = f.get();
     }
 
diff --git a/src/libextra/getopts.rs b/src/libextra/getopts.rs
index b5a98bd0740..e9ccbbf605a 100644
--- a/src/libextra/getopts.rs
+++ b/src/libextra/getopts.rs
@@ -60,7 +60,7 @@
 //!     ];
 //!     let matches = match getopts(args.tail(), opts) {
 //!         Ok(m) => { m }
-//!         Err(f) => { fail!(f.to_err_msg()) }
+//!         Err(f) => { fail2!(f.to_err_msg()) }
 //!     };
 //!     if matches.opt_present("h") || matches.opt_present("help") {
 //!         print_usage(program, opts);
@@ -185,7 +185,7 @@ impl Matches {
     pub fn opt_vals(&self, nm: &str) -> ~[Optval] {
         match find_opt(self.opts, Name::from_str(nm)) {
             Some(id) => self.vals[id].clone(),
-            None => fail!("No option '%s' defined", nm)
+            None => fail2!("No option '{}' defined", nm)
         }
     }
 
@@ -365,19 +365,19 @@ impl Fail_ {
     pub fn to_err_msg(self) -> ~str {
         match self {
             ArgumentMissing(ref nm) => {
-                fmt!("Argument to option '%s' missing.", *nm)
+                format!("Argument to option '{}' missing.", *nm)
             }
             UnrecognizedOption(ref nm) => {
-                fmt!("Unrecognized option: '%s'.", *nm)
+                format!("Unrecognized option: '{}'.", *nm)
             }
             OptionMissing(ref nm) => {
-                fmt!("Required option '%s' missing.", *nm)
+                format!("Required option '{}' missing.", *nm)
             }
             OptionDuplicated(ref nm) => {
-                fmt!("Option '%s' given more than once.", *nm)
+                format!("Option '{}' given more than once.", *nm)
             }
             UnexpectedArgument(ref nm) => {
-                fmt!("Option '%s' does not take an argument.", *nm)
+                format!("Option '{}' does not take an argument.", *nm)
             }
         }
     }
@@ -551,7 +551,7 @@ pub mod groups {
             } = (*self).clone();
 
             match (short_name.len(), long_name.len()) {
-                (0,0) => fail!("this long-format option was given no name"),
+                (0,0) => fail2!("this long-format option was given no name"),
                 (0,_) => Opt {
                     name: Long((long_name)),
                     hasarg: hasarg,
@@ -577,7 +577,7 @@ pub mod groups {
                         }
                     ]
                 },
-                (_,_) => fail!("something is wrong with the long-form opt")
+                (_,_) => fail2!("something is wrong with the long-form opt")
             }
         }
     }
@@ -696,7 +696,7 @@ pub mod groups {
                     row.push_str(short_name);
                     row.push_char(' ');
                 }
-                _ => fail!("the short name should only be 1 ascii char long"),
+                _ => fail2!("the short name should only be 1 ascii char long"),
             }
 
             // long option
@@ -752,7 +752,7 @@ pub mod groups {
             row
         });
 
-        fmt!("%s\n\nOptions:\n%s\n", brief, rows.collect::<~[~str]>().connect("\n"))
+        format!("{}\n\nOptions:\n{}\n", brief, rows.collect::<~[~str]>().connect("\n"))
     }
 
     /// Splits a string into substrings with possibly internal whitespace,
@@ -810,7 +810,7 @@ pub mod groups {
 
                 (B, Cr, UnderLim) => { B }
                 (B, Cr, OverLim)  if (i - last_start + 1) > lim
-                                => fail!("word starting with %? longer than limit!",
+                                => fail2!("word starting with {} longer than limit!",
                                         ss.slice(last_start, i + 1)),
                 (B, Cr, OverLim)  => { slice(); slice_start = last_start; B }
                 (B, Ws, UnderLim) => { last_end = i; C }
@@ -883,7 +883,7 @@ mod tests {
             assert!(m.opt_present("test"));
             assert_eq!(m.opt_str("test").unwrap(), ~"20");
           }
-          _ => { fail!("test_reqopt_long failed"); }
+          _ => { fail2!("test_reqopt_long failed"); }
         }
     }
 
@@ -894,7 +894,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, OptionMissing_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -905,7 +905,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, ArgumentMissing_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -916,7 +916,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, OptionDuplicated_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -930,7 +930,7 @@ mod tests {
             assert!(m.opt_present("t"));
             assert_eq!(m.opt_str("t").unwrap(), ~"20");
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -941,7 +941,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, OptionMissing_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -952,7 +952,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, ArgumentMissing_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -963,7 +963,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, OptionDuplicated_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -979,7 +979,7 @@ mod tests {
             assert!(m.opt_present("test"));
             assert_eq!(m.opt_str("test").unwrap(), ~"20");
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -990,7 +990,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Ok(ref m) => assert!(!m.opt_present("test")),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1001,7 +1001,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, ArgumentMissing_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1012,7 +1012,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, OptionDuplicated_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1026,7 +1026,7 @@ mod tests {
             assert!((m.opt_present("t")));
             assert_eq!(m.opt_str("t").unwrap(), ~"20");
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1037,7 +1037,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Ok(ref m) => assert!(!m.opt_present("t")),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1048,7 +1048,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, ArgumentMissing_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1059,7 +1059,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, OptionDuplicated_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1072,7 +1072,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Ok(ref m) => assert!(m.opt_present("test")),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1083,7 +1083,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Ok(ref m) => assert!(!m.opt_present("test")),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1094,10 +1094,10 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => {
-            error!(f.clone().to_err_msg());
+            error2!("{:?}", f.clone().to_err_msg());
             check_fail_type(f, UnexpectedArgument_);
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1108,7 +1108,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, OptionDuplicated_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1119,7 +1119,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Ok(ref m) => assert!(m.opt_present("t")),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1130,7 +1130,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Ok(ref m) => assert!(!m.opt_present("t")),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1145,7 +1145,7 @@ mod tests {
 
             assert!(m.free[0] == ~"20");
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1156,7 +1156,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, OptionDuplicated_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1170,7 +1170,7 @@ mod tests {
           Ok(ref m) => {
             assert_eq!(m.opt_count("v"), 1);
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1183,7 +1183,7 @@ mod tests {
           Ok(ref m) => {
             assert_eq!(m.opt_count("v"), 2);
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1196,7 +1196,7 @@ mod tests {
           Ok(ref m) => {
             assert_eq!(m.opt_count("v"), 2);
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1209,7 +1209,7 @@ mod tests {
           Ok(ref m) => {
             assert_eq!(m.opt_count("verbose"), 1);
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1222,7 +1222,7 @@ mod tests {
           Ok(ref m) => {
             assert_eq!(m.opt_count("verbose"), 2);
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1237,7 +1237,7 @@ mod tests {
             assert!((m.opt_present("test")));
             assert_eq!(m.opt_str("test").unwrap(), ~"20");
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1248,7 +1248,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Ok(ref m) => assert!(!m.opt_present("test")),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1259,7 +1259,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, ArgumentMissing_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1276,7 +1276,7 @@ mod tests {
               assert!(pair[0] == ~"20");
               assert!(pair[1] == ~"30");
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1290,7 +1290,7 @@ mod tests {
             assert!((m.opt_present("t")));
             assert_eq!(m.opt_str("t").unwrap(), ~"20");
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1301,7 +1301,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Ok(ref m) => assert!(!m.opt_present("t")),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1312,7 +1312,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, ArgumentMissing_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1329,7 +1329,7 @@ mod tests {
             assert!(pair[0] == ~"20");
             assert!(pair[1] == ~"30");
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1340,7 +1340,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, UnrecognizedOption_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1351,7 +1351,7 @@ mod tests {
         let rs = getopts(args, opts);
         match rs {
           Err(f) => check_fail_type(f, UnrecognizedOption_),
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1383,7 +1383,7 @@ mod tests {
             assert!(pair[1] == ~"-60 70");
             assert!((!m.opt_present("notpresent")));
           }
-          _ => fail!()
+          _ => fail2!()
         }
     }
 
@@ -1394,7 +1394,7 @@ mod tests {
         let args_single = ~[~"-e", ~"foo"];
         let matches_single = &match getopts(args_single, opts) {
           result::Ok(m) => m,
-          result::Err(_) => fail!()
+          result::Err(_) => fail2!()
         };
         assert!(matches_single.opts_present([~"e"]));
         assert!(matches_single.opts_present([~"encrypt", ~"e"]));
@@ -1410,7 +1410,7 @@ mod tests {
         let args_both = ~[~"-e", ~"foo", ~"--encrypt", ~"foo"];
         let matches_both = &match getopts(args_both, opts) {
           result::Ok(m) => m,
-          result::Err(_) => fail!()
+          result::Err(_) => fail2!()
         };
         assert!(matches_both.opts_present([~"e"]));
         assert!(matches_both.opts_present([~"encrypt"]));
@@ -1432,7 +1432,7 @@ mod tests {
         let opts = ~[optmulti("L"), optmulti("M")];
         let matches = &match getopts(args, opts) {
           result::Ok(m) => m,
-          result::Err(_) => fail!()
+          result::Err(_) => fail2!()
         };
         assert!(matches.opts_present([~"L"]));
         assert_eq!(matches.opts_str([~"L"]).unwrap(), ~"foo");
@@ -1575,8 +1575,8 @@ Options:
 
         let generated_usage = groups::usage("Usage: fruits", optgroups);
 
-        debug!("expected: <<%s>>", expected);
-        debug!("generated: <<%s>>", generated_usage);
+        debug2!("expected: <<{}>>", expected);
+        debug2!("generated: <<{}>>", generated_usage);
         assert_eq!(generated_usage, expected);
     }
 
@@ -1603,8 +1603,8 @@ Options:
 
         let usage = groups::usage("Usage: fruits", optgroups);
 
-        debug!("expected: <<%s>>", expected);
-        debug!("generated: <<%s>>", usage);
+        debug2!("expected: <<{}>>", expected);
+        debug2!("generated: <<{}>>", usage);
         assert!(usage == expected)
     }
 
@@ -1630,8 +1630,8 @@ Options:
 
         let usage = groups::usage("Usage: fruits", optgroups);
 
-        debug!("expected: <<%s>>", expected);
-        debug!("generated: <<%s>>", usage);
+        debug2!("expected: <<{}>>", expected);
+        debug2!("generated: <<{}>>", usage);
         assert!(usage == expected)
     }
 }
diff --git a/src/libextra/glob.rs b/src/libextra/glob.rs
index 76ac7c91832..9af2f1acc69 100644
--- a/src/libextra/glob.rs
+++ b/src/libextra/glob.rs
@@ -552,13 +552,13 @@ mod test {
 
         let pat = Pattern::new("a[0-9]b");
         for i in range(0, 10) {
-            assert!(pat.matches(fmt!("a%db", i)));
+            assert!(pat.matches(format!("a{}b", i)));
         }
         assert!(!pat.matches("a_b"));
 
         let pat = Pattern::new("a[!0-9]b");
         for i in range(0, 10) {
-            assert!(!pat.matches(fmt!("a%db", i)));
+            assert!(!pat.matches(format!("a{}b", i)));
         }
         assert!(pat.matches("a_b"));
 
diff --git a/src/libextra/hex.rs b/src/libextra/hex.rs
index ad812513f84..709b4a95981 100644
--- a/src/libextra/hex.rs
+++ b/src/libextra/hex.rs
@@ -102,8 +102,8 @@ impl<'self> FromHex for &'self str {
                     buf >>= 4;
                     loop
                 }
-                _ => return Err(fmt!("Invalid character '%c' at position %u",
-                                     self.char_at(idx), idx))
+                _ => return Err(format!("Invalid character '{}' at position {}",
+                                        self.char_at(idx), idx))
             }
 
             modulus += 1;
@@ -158,15 +158,15 @@ mod tests {
     #[test]
     pub fn test_to_hex_all_bytes() {
         for i in range(0, 256) {
-            assert_eq!([i as u8].to_hex(), fmt!("%02x", i as uint));
+            assert_eq!([i as u8].to_hex(), format!("{:02x}", i as uint));
         }
     }
 
     #[test]
     pub fn test_from_hex_all_bytes() {
         for i in range(0, 256) {
-            assert_eq!(fmt!("%02x", i as uint).from_hex().unwrap(), ~[i as u8]);
-            assert_eq!(fmt!("%02X", i as uint).from_hex().unwrap(), ~[i as u8]);
+            assert_eq!(format!("{:02x}", i as uint).from_hex().unwrap(), ~[i as u8]);
+            assert_eq!(format!("{:02X}", i as uint).from_hex().unwrap(), ~[i as u8]);
         }
     }
 
diff --git a/src/libextra/json.rs b/src/libextra/json.rs
index e0e860d102e..fe1bbfc9ae4 100644
--- a/src/libextra/json.rs
+++ b/src/libextra/json.rs
@@ -885,10 +885,10 @@ pub fn Decoder(json: Json) -> Decoder {
 
 impl serialize::Decoder for Decoder {
     fn read_nil(&mut self) -> () {
-        debug!("read_nil");
+        debug2!("read_nil");
         match self.stack.pop() {
             Null => (),
-            value => fail!("not a null: %?", value)
+            value => fail2!("not a null: {:?}", value)
         }
     }
 
@@ -905,20 +905,20 @@ impl serialize::Decoder for Decoder {
     fn read_int(&mut self) -> int { self.read_float() as int }
 
     fn read_bool(&mut self) -> bool {
-        debug!("read_bool");
+        debug2!("read_bool");
         match self.stack.pop() {
             Boolean(b) => b,
-            value => fail!("not a boolean: %?", value)
+            value => fail2!("not a boolean: {:?}", value)
         }
     }
 
     fn read_f64(&mut self) -> f64 { self.read_float() as f64 }
     fn read_f32(&mut self) -> f32 { self.read_float() as f32 }
     fn read_float(&mut self) -> float {
-        debug!("read_float");
+        debug2!("read_float");
         match self.stack.pop() {
             Number(f) => f,
-            value => fail!("not a number: %?", value)
+            value => fail2!("not a number: {:?}", value)
         }
     }
 
@@ -926,20 +926,20 @@ impl serialize::Decoder for Decoder {
         let mut v = ~[];
         let s = self.read_str();
         for c in s.iter() { v.push(c) }
-        if v.len() != 1 { fail!("string must have one character") }
+        if v.len() != 1 { fail2!("string must have one character") }
         v[0]
     }
 
     fn read_str(&mut self) -> ~str {
-        debug!("read_str");
+        debug2!("read_str");
         match self.stack.pop() {
             String(s) => s,
-            json => fail!("not a string: %?", json)
+            json => fail2!("not a string: {:?}", json)
         }
     }
 
     fn read_enum<T>(&mut self, name: &str, f: &fn(&mut Decoder) -> T) -> T {
-        debug!("read_enum(%s)", name);
+        debug2!("read_enum({})", name);
         f(self)
     }
 
@@ -947,13 +947,13 @@ impl serialize::Decoder for Decoder {
                             names: &[&str],
                             f: &fn(&mut Decoder, uint) -> T)
                             -> T {
-        debug!("read_enum_variant(names=%?)", names);
+        debug2!("read_enum_variant(names={:?})", names);
         let name = match self.stack.pop() {
             String(s) => s,
             Object(o) => {
                 let n = match o.find(&~"variant").expect("invalidly encoded json") {
                     &String(ref s) => s.clone(),
-                    _ => fail!("invalidly encoded json"),
+                    _ => fail2!("invalidly encoded json"),
                 };
                 match o.find(&~"fields").expect("invalidly encoded json") {
                     &List(ref l) => {
@@ -961,15 +961,15 @@ impl serialize::Decoder for Decoder {
                             self.stack.push(field.clone());
                         }
                     },
-                    _ => fail!("invalidly encoded json")
+                    _ => fail2!("invalidly encoded json")
                 }
                 n
             }
-            ref json => fail!("invalid variant: %?", *json),
+            ref json => fail2!("invalid variant: {:?}", *json),
         };
         let idx = match names.iter().position(|n| str::eq_slice(*n, name)) {
             Some(idx) => idx,
-            None => fail!("Unknown variant name: %?", name),
+            None => fail2!("Unknown variant name: {}", name),
         };
         f(self, idx)
     }
@@ -978,7 +978,7 @@ impl serialize::Decoder for Decoder {
                                 idx: uint,
                                 f: &fn(&mut Decoder) -> T)
                                 -> T {
-        debug!("read_enum_variant_arg(idx=%u)", idx);
+        debug2!("read_enum_variant_arg(idx={})", idx);
         f(self)
     }
 
@@ -986,7 +986,7 @@ impl serialize::Decoder for Decoder {
                                    names: &[&str],
                                    f: &fn(&mut Decoder, uint) -> T)
                                    -> T {
-        debug!("read_enum_struct_variant(names=%?)", names);
+        debug2!("read_enum_struct_variant(names={:?})", names);
         self.read_enum_variant(names, f)
     }
 
@@ -996,7 +996,7 @@ impl serialize::Decoder for Decoder {
                                          idx: uint,
                                          f: &fn(&mut Decoder) -> T)
                                          -> T {
-        debug!("read_enum_struct_variant_field(name=%?, idx=%u)", name, idx);
+        debug2!("read_enum_struct_variant_field(name={}, idx={})", name, idx);
         self.read_enum_variant_arg(idx, f)
     }
 
@@ -1005,7 +1005,7 @@ impl serialize::Decoder for Decoder {
                       len: uint,
                       f: &fn(&mut Decoder) -> T)
                       -> T {
-        debug!("read_struct(name=%s, len=%u)", name, len);
+        debug2!("read_struct(name={}, len={})", name, len);
         let value = f(self);
         self.stack.pop();
         value
@@ -1016,12 +1016,12 @@ impl serialize::Decoder for Decoder {
                             idx: uint,
                             f: &fn(&mut Decoder) -> T)
                             -> T {
-        debug!("read_struct_field(name=%?, idx=%u)", name, idx);
+        debug2!("read_struct_field(name={}, idx={})", name, idx);
         match self.stack.pop() {
             Object(obj) => {
                 let mut obj = obj;
                 let value = match obj.pop(&name.to_owned()) {
-                    None => fail!("no such field: %s", name),
+                    None => fail2!("no such field: {}", name),
                     Some(json) => {
                         self.stack.push(json);
                         f(self)
@@ -1030,12 +1030,12 @@ impl serialize::Decoder for Decoder {
                 self.stack.push(Object(obj));
                 value
             }
-            value => fail!("not an object: %?", value)
+            value => fail2!("not an object: {:?}", value)
         }
     }
 
     fn read_tuple<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
-        debug!("read_tuple()");
+        debug2!("read_tuple()");
         self.read_seq(f)
     }
 
@@ -1043,7 +1043,7 @@ impl serialize::Decoder for Decoder {
                          idx: uint,
                          f: &fn(&mut Decoder) -> T)
                          -> T {
-        debug!("read_tuple_arg(idx=%u)", idx);
+        debug2!("read_tuple_arg(idx={})", idx);
         self.read_seq_elt(idx, f)
     }
 
@@ -1051,7 +1051,7 @@ impl serialize::Decoder for Decoder {
                             name: &str,
                             f: &fn(&mut Decoder, uint) -> T)
                             -> T {
-        debug!("read_tuple_struct(name=%?)", name);
+        debug2!("read_tuple_struct(name={})", name);
         self.read_tuple(f)
     }
 
@@ -1059,7 +1059,7 @@ impl serialize::Decoder for Decoder {
                                 idx: uint,
                                 f: &fn(&mut Decoder) -> T)
                                 -> T {
-        debug!("read_tuple_struct_arg(idx=%u)", idx);
+        debug2!("read_tuple_struct_arg(idx={})", idx);
         self.read_tuple_arg(idx, f)
     }
 
@@ -1071,7 +1071,7 @@ impl serialize::Decoder for Decoder {
     }
 
     fn read_seq<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
-        debug!("read_seq()");
+        debug2!("read_seq()");
         let len = match self.stack.pop() {
             List(list) => {
                 let len = list.len();
@@ -1080,18 +1080,18 @@ impl serialize::Decoder for Decoder {
                 }
                 len
             }
-            _ => fail!("not a list"),
+            _ => fail2!("not a list"),
         };
         f(self, len)
     }
 
     fn read_seq_elt<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T) -> T {
-        debug!("read_seq_elt(idx=%u)", idx);
+        debug2!("read_seq_elt(idx={})", idx);
         f(self)
     }
 
     fn read_map<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
-        debug!("read_map()");
+        debug2!("read_map()");
         let len = match self.stack.pop() {
             Object(obj) => {
                 let len = obj.len();
@@ -1101,7 +1101,7 @@ impl serialize::Decoder for Decoder {
                 }
                 len
             }
-            json => fail!("not an object: %?", json),
+            json => fail2!("not an object: {:?}", json),
         };
         f(self, len)
     }
@@ -1110,13 +1110,13 @@ impl serialize::Decoder for Decoder {
                            idx: uint,
                            f: &fn(&mut Decoder) -> T)
                            -> T {
-        debug!("read_map_elt_key(idx=%u)", idx);
+        debug2!("read_map_elt_key(idx={})", idx);
         f(self)
     }
 
     fn read_map_elt_val<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T)
                            -> T {
-        debug!("read_map_elt_val(idx=%u)", idx);
+        debug2!("read_map_elt_val(idx={})", idx);
         f(self)
     }
 }
@@ -1321,7 +1321,7 @@ impl to_str::ToStr for Json {
 
 impl to_str::ToStr for Error {
     fn to_str(&self) -> ~str {
-        fmt!("%u:%u: %s", self.line, self.col, *self.msg)
+        format!("{}:{}: {}", self.line, self.col, *self.msg)
     }
 }
 
diff --git a/src/libextra/list.rs b/src/libextra/list.rs
index 0e8c50ac873..5283edbf475 100644
--- a/src/libextra/list.rs
+++ b/src/libextra/list.rs
@@ -96,7 +96,7 @@ pub fn len<T>(ls: @List<T>) -> uint {
 pub fn tail<T>(ls: @List<T>) -> @List<T> {
     match *ls {
         Cons(_, tl) => return tl,
-        Nil => fail!("list empty")
+        Nil => fail2!("list empty")
     }
 }
 
@@ -105,7 +105,7 @@ pub fn head<T:Clone>(ls: @List<T>) -> T {
     match *ls {
       Cons(ref hd, _) => (*hd).clone(),
       // makes me sad
-      _ => fail!("head invoked on empty list")
+      _ => fail2!("head invoked on empty list")
     }
 }
 
diff --git a/src/libextra/num/bigint.rs b/src/libextra/num/bigint.rs
index efb39f7c51e..2ec9c747179 100644
--- a/src/libextra/num/bigint.rs
+++ b/src/libextra/num/bigint.rs
@@ -352,7 +352,7 @@ impl Rem<BigUint, BigUint> for BigUint {
 
 impl Neg<BigUint> for BigUint {
     #[inline]
-    fn neg(&self) -> BigUint { fail!() }
+    fn neg(&self) -> BigUint { fail2!() }
 }
 
 impl Integer for BigUint {
@@ -374,7 +374,7 @@ impl Integer for BigUint {
     }
 
     fn div_mod_floor(&self, other: &BigUint) -> (BigUint, BigUint) {
-        if other.is_zero() { fail!() }
+        if other.is_zero() { fail2!() }
         if self.is_zero() { return (Zero::zero(), Zero::zero()); }
         if *other == One::one() { return ((*self).clone(), Zero::zero()); }
 
@@ -726,7 +726,7 @@ fn get_radix_base(radix: uint) -> (uint, uint) {
         14 => (1475789056, 8),
         15 => (2562890625, 8),
         16 => (4294967296, 8),
-        _  => fail!()
+        _  => fail2!()
     }
 }
 
@@ -750,7 +750,7 @@ fn get_radix_base(radix: uint) -> (uint, uint) {
         14 => (38416, 4),
         15 => (50625, 4),
         16 => (65536, 4),
-        _  => fail!()
+        _  => fail2!()
     }
 }
 
@@ -1004,7 +1004,7 @@ impl Integer for BigInt {
         let d = BigInt::from_biguint(Plus, d_ui);
         let r = BigInt::from_biguint(Plus, r_ui);
         match (self.sign, other.sign) {
-            (_,    Zero)   => fail!(),
+            (_,    Zero)   => fail2!(),
             (Plus, Plus)  | (Zero, Plus)  => ( d,  r),
             (Plus, Minus) | (Zero, Minus) => (-d,  r),
             (Minus, Plus)                 => (-d, -r),
@@ -1030,7 +1030,7 @@ impl Integer for BigInt {
         let d = BigInt::from_biguint(Plus, d_ui);
         let m = BigInt::from_biguint(Plus, m_ui);
         match (self.sign, other.sign) {
-            (_,    Zero)   => fail!(),
+            (_,    Zero)   => fail2!(),
             (Plus, Plus)  | (Zero, Plus)  => (d, m),
             (Plus, Minus) | (Zero, Minus) => if m.is_zero() {
                 (-d, Zero::zero())
@@ -1742,7 +1742,7 @@ mod biguint_tests {
              ~"2" +
              str::from_chars(vec::from_elem(bits / 2 - 1, '0')) + "1"),
             (10, match bits {
-                32 => ~"8589934593", 16 => ~"131073", _ => fail!()
+                32 => ~"8589934593", 16 => ~"131073", _ => fail2!()
             }),
             (16,
              ~"2" +
@@ -1759,7 +1759,7 @@ mod biguint_tests {
             (10, match bits {
                 32 => ~"55340232229718589441",
                 16 => ~"12885032961",
-                _ => fail!()
+                _ => fail2!()
             }),
             (16, ~"3" +
              str::from_chars(vec::from_elem(bits / 4 - 1, '0')) + "2" +
@@ -1814,7 +1814,7 @@ mod biguint_tests {
         fn check(n: uint, s: &str) {
             let n = factor(n);
             let ans = match FromStrRadix::from_str_radix(s, 10) {
-                Some(x) => x, None => fail!()
+                Some(x) => x, None => fail2!()
             };
             assert_eq!(n, ans);
         }
diff --git a/src/libextra/num/complex.rs b/src/libextra/num/complex.rs
index 669dc1c1b45..8943e2ac012 100644
--- a/src/libextra/num/complex.rs
+++ b/src/libextra/num/complex.rs
@@ -172,9 +172,9 @@ impl<T: Clone + Num> One for Cmplx<T> {
 impl<T: ToStr + Num + Ord> ToStr for Cmplx<T> {
     fn to_str(&self) -> ~str {
         if self.im < Zero::zero() {
-            fmt!("%s-%si", self.re.to_str(), (-self.im).to_str())
+            format!("{}-{}i", self.re.to_str(), (-self.im).to_str())
         } else {
-            fmt!("%s+%si", self.re.to_str(), self.im.to_str())
+            format!("{}+{}i", self.re.to_str(), self.im.to_str())
         }
     }
 }
@@ -182,9 +182,9 @@ impl<T: ToStr + Num + Ord> ToStr for Cmplx<T> {
 impl<T: ToStrRadix + Num + Ord> ToStrRadix for Cmplx<T> {
     fn to_str_radix(&self, radix: uint) -> ~str {
         if self.im < Zero::zero() {
-            fmt!("%s-%si", self.re.to_str_radix(radix), (-self.im).to_str_radix(radix))
+            format!("{}-{}i", self.re.to_str_radix(radix), (-self.im).to_str_radix(radix))
         } else {
-            fmt!("%s+%si", self.re.to_str_radix(radix), self.im.to_str_radix(radix))
+            format!("{}+{}i", self.re.to_str_radix(radix), self.im.to_str_radix(radix))
         }
     }
 }
diff --git a/src/libextra/num/rational.rs b/src/libextra/num/rational.rs
index 1991d9f1b5b..e7142f6f9ff 100644
--- a/src/libextra/num/rational.rs
+++ b/src/libextra/num/rational.rs
@@ -50,7 +50,7 @@ impl<T: Clone + Integer + Ord>
     #[inline]
     pub fn new(numer: T, denom: T) -> Ratio<T> {
         if denom == Zero::zero() {
-            fail!("denominator == 0");
+            fail2!("denominator == 0");
         }
         let mut ret = Ratio::new_raw(numer, denom);
         ret.reduce();
@@ -254,13 +254,13 @@ impl<T: Clone + Integer + Ord> Fractional for Ratio<T> {
 impl<T: ToStr> ToStr for Ratio<T> {
     /// Renders as `numer/denom`.
     fn to_str(&self) -> ~str {
-        fmt!("%s/%s", self.numer.to_str(), self.denom.to_str())
+        format!("{}/{}", self.numer.to_str(), self.denom.to_str())
     }
 }
 impl<T: ToStrRadix> ToStrRadix for Ratio<T> {
     /// Renders as `numer/denom` where the numbers are in base `radix`.
     fn to_str_radix(&self, radix: uint) -> ~str {
-        fmt!("%s/%s", self.numer.to_str_radix(radix), self.denom.to_str_radix(radix))
+        format!("{}/{}", self.numer.to_str_radix(radix), self.denom.to_str_radix(radix))
     }
 }
 
diff --git a/src/libextra/ringbuf.rs b/src/libextra/ringbuf.rs
index 1e396291405..5738faeca95 100644
--- a/src/libextra/ringbuf.rs
+++ b/src/libextra/ringbuf.rs
@@ -127,7 +127,7 @@ impl<T> RingBuf<T> {
     pub fn get<'a>(&'a self, i: uint) -> &'a T {
         let idx = self.raw_index(i);
         match self.elts[idx] {
-            None => fail!(),
+            None => fail2!(),
             Some(ref v) => v
         }
     }
@@ -138,7 +138,7 @@ impl<T> RingBuf<T> {
     pub fn get_mut<'a>(&'a mut self, i: uint) -> &'a mut T {
         let idx = self.raw_index(i);
         match self.elts[idx] {
-            None => fail!(),
+            None => fail2!(),
             Some(ref mut v) => v
         }
     }
@@ -373,21 +373,21 @@ mod tests {
         assert_eq!(d.len(), 3u);
         d.push_back(137);
         assert_eq!(d.len(), 4u);
-        debug!(d.front());
+        debug2!("{:?}", d.front());
         assert_eq!(*d.front().unwrap(), 42);
-        debug!(d.back());
+        debug2!("{:?}", d.back());
         assert_eq!(*d.back().unwrap(), 137);
         let mut i = d.pop_front();
-        debug!(i);
+        debug2!("{:?}", i);
         assert_eq!(i, Some(42));
         i = d.pop_back();
-        debug!(i);
+        debug2!("{:?}", i);
         assert_eq!(i, Some(137));
         i = d.pop_back();
-        debug!(i);
+        debug2!("{:?}", i);
         assert_eq!(i, Some(137));
         i = d.pop_back();
-        debug!(i);
+        debug2!("{:?}", i);
         assert_eq!(i, Some(17));
         assert_eq!(d.len(), 0u);
         d.push_back(3);
@@ -398,10 +398,10 @@ mod tests {
         assert_eq!(d.len(), 3u);
         d.push_front(1);
         assert_eq!(d.len(), 4u);
-        debug!(d.get(0));
-        debug!(d.get(1));
-        debug!(d.get(2));
-        debug!(d.get(3));
+        debug2!("{:?}", d.get(0));
+        debug2!("{:?}", d.get(1));
+        debug2!("{:?}", d.get(2));
+        debug2!("{:?}", d.get(3));
         assert_eq!(*d.get(0), 1);
         assert_eq!(*d.get(1), 2);
         assert_eq!(*d.get(2), 3);
diff --git a/src/libextra/semver.rs b/src/libextra/semver.rs
index 1644efb8070..fff10533af1 100644
--- a/src/libextra/semver.rs
+++ b/src/libextra/semver.rs
@@ -86,16 +86,16 @@ pub struct Version {
 impl ToStr for Version {
     #[inline]
     fn to_str(&self) -> ~str {
-        let s = fmt!("%u.%u.%u", self.major, self.minor, self.patch);
+        let s = format!("{}.{}.{}", self.major, self.minor, self.patch);
         let s = if self.pre.is_empty() {
             s
         } else {
-            fmt!("%s-%s", s, self.pre.map(|i| i.to_str()).connect("."))
+            format!("{}-{}", s, self.pre.map(|i| i.to_str()).connect("."))
         };
         if self.build.is_empty() {
             s
         } else {
-            fmt!("%s+%s", s, self.build.map(|i| i.to_str()).connect("."))
+            format!("{}+{}", s, self.build.map(|i| i.to_str()).connect("."))
         }
     }
 }
@@ -158,7 +158,7 @@ fn take_nonempty_prefix(rdr: @io::Reader,
     if buf.is_empty() {
         bad_parse::cond.raise(())
     }
-    debug!("extracted nonempty prefix: %s", buf);
+    debug2!("extracted nonempty prefix: {}", buf);
     (buf, ch)
 }
 
@@ -234,7 +234,7 @@ pub fn parse(s: &str) -> Option<Version> {
     }
     let s = s.trim();
     let mut bad = false;
-    do bad_parse::cond.trap(|_| { debug!("bad"); bad = true }).inside {
+    do bad_parse::cond.trap(|_| { debug2!("bad"); bad = true }).inside {
         do io::with_str_reader(s) |rdr| {
             let v = parse_reader(rdr);
             if bad || v.to_str() != s.to_owned() {
diff --git a/src/libextra/smallintmap.rs b/src/libextra/smallintmap.rs
index 983247971d3..2108415f468 100644
--- a/src/libextra/smallintmap.rs
+++ b/src/libextra/smallintmap.rs
@@ -265,7 +265,7 @@ mod test_map {
         assert!(m.insert(5, 14));
         let new = 100;
         match m.find_mut(&5) {
-            None => fail!(), Some(x) => *x = new
+            None => fail2!(), Some(x) => *x = new
         }
         assert_eq!(m.find(&5), Some(&new));
     }
diff --git a/src/libextra/sort.rs b/src/libextra/sort.rs
index bab889ff924..5293a2c3fd7 100644
--- a/src/libextra/sort.rs
+++ b/src/libextra/sort.rs
@@ -564,7 +564,7 @@ impl<T:Clone + Ord> MergeState<T> {
             shift_vec(array, dest, c2, len2);
             swap(&mut array[dest+len2], &mut tmp[c1]);
         } else if len1 == 0 {
-            fail!("Comparison violates its contract!");
+            fail2!("Comparison violates its contract!");
         } else {
             assert_eq!(len2, 0);
             assert!(len1 > 1);
@@ -683,7 +683,7 @@ impl<T:Clone + Ord> MergeState<T> {
             shift_vec(array, dest+1, c1+1, len1);
             swap(&mut array[dest], &mut tmp[c2]);
         } else if len2 == 0 {
-            fail!("Comparison violates its contract!");
+            fail2!("Comparison violates its contract!");
         } else {
             assert_eq!(len1, 0);
             assert!(len2 != 0);
@@ -790,7 +790,7 @@ mod test_qsort {
         quick_sort::<int>(v1, leual);
         let mut i = 0u;
         while i < len {
-            // debug!(v2[i]);
+            // debug2!(v2[i]);
             assert_eq!(v2[i], v1[i]);
             i += 1;
         }
@@ -833,7 +833,7 @@ mod test_qsort {
         let immut_names = names;
 
         for (&a, &b) in expected.iter().zip(immut_names.iter()) {
-            debug!("%d %d", a, b);
+            debug2!("{} {}", a, b);
             assert_eq!(a, b);
         }
     }
@@ -851,7 +851,7 @@ mod tests {
         let v3 = merge_sort::<int>(v1, f);
         let mut i = 0u;
         while i < len {
-            debug!(v3[i]);
+            debug2!("{:?}", v3[i]);
             assert_eq!(v3[i], v2[i]);
             i += 1;
         }
@@ -922,7 +922,7 @@ mod test_tim_sort {
         fn lt(&self, other: &CVal) -> bool {
             let mut rng = rand::rng();
             if rng.gen::<float>() > 0.995 {
-                fail!("It's happening!!!");
+                fail2!("It's happening!!!");
             }
             (*self).val < other.val
         }
@@ -936,7 +936,7 @@ mod test_tim_sort {
         tim_sort::<int>(v1);
         let mut i = 0u;
         while i < len {
-            // debug!(v2[i]);
+            // debug2!(v2[i]);
             assert_eq!(v2[i], v1[i]);
             i += 1u;
         }
@@ -977,7 +977,7 @@ mod test_tim_sort {
         };
 
         tim_sort(arr);
-        fail!("Guarantee the fail");
+        fail2!("Guarantee the fail");
     }
 
     #[deriving(Clone)]
@@ -1045,7 +1045,7 @@ mod big_tests {
         fn isSorted<T:Ord>(arr: &[T]) {
             for i in range(0u, arr.len() - 1) {
                 if arr[i] > arr[i+1] {
-                    fail!("Array not sorted");
+                    fail2!("Array not sorted");
                 }
             }
         }
@@ -1116,7 +1116,7 @@ mod big_tests {
         fn isSorted<T:Ord>(arr: &[@T]) {
             for i in range(0u, arr.len() - 1) {
                 if arr[i] > arr[i+1] {
-                    fail!("Array not sorted");
+                    fail2!("Array not sorted");
                 }
             }
         }
diff --git a/src/libextra/stats.rs b/src/libextra/stats.rs
index 2b6c53b3c86..64c4a4a03fd 100644
--- a/src/libextra/stats.rs
+++ b/src/libextra/stats.rs
@@ -267,12 +267,12 @@ pub fn winsorize(samples: &mut [f64], pct: f64) {
 /// Render writes the min, max and quartiles of the provided `Summary` to the provided `Writer`.
 pub fn write_5_number_summary(w: @io::Writer, s: &Summary) {
     let (q1,q2,q3) = s.quartiles;
-    w.write_str(fmt!("(min=%f, q1=%f, med=%f, q3=%f, max=%f)",
-                     s.min as float,
-                     q1 as float,
-                     q2 as float,
-                     q3 as float,
-                     s.max as float));
+    w.write_str(format!("(min={}, q1={}, med={}, q3={}, max={})",
+                     s.min,
+                     q1,
+                     q2,
+                     q3,
+                     s.max));
 }
 
 /// Render a boxplot to the provided writer. The boxplot shows the min, max and quartiles of the
diff --git a/src/libextra/sync.rs b/src/libextra/sync.rs
index 31ae5e70a99..75060166f8c 100644
--- a/src/libextra/sync.rs
+++ b/src/libextra/sync.rs
@@ -307,9 +307,9 @@ fn check_cvar_bounds<U>(out_of_bounds: Option<uint>, id: uint, act: &str,
                         blk: &fn() -> U) -> U {
     match out_of_bounds {
         Some(0) =>
-            fail!("%s with illegal ID %u - this lock has no condvars!", act, id),
+            fail2!("{} with illegal ID {} - this lock has no condvars!", act, id),
         Some(length) =>
-            fail!("%s with illegal ID %u - ID must be less than %u", act, id, length),
+            fail2!("{} with illegal ID {} - ID must be less than {}", act, id, length),
         None => blk()
     }
 }
@@ -634,7 +634,7 @@ impl RWLock {
     pub fn downgrade<'a>(&self, token: RWLockWriteMode<'a>)
                          -> RWLockReadMode<'a> {
         if !borrow::ref_eq(self, token.lock) {
-            fail!("Can't downgrade() with a different rwlock's write_mode!");
+            fail2!("Can't downgrade() with a different rwlock's write_mode!");
         }
         unsafe {
             do task::unkillable {
@@ -918,7 +918,7 @@ mod tests {
 
         let result: result::Result<(),()> = do task::try {
             do m2.lock {
-                fail!();
+                fail2!();
             }
         };
         assert!(result.is_err());
@@ -938,7 +938,7 @@ mod tests {
             do task::spawn || { // linked
                 let _ = p.recv(); // wait for sibling to get in the mutex
                 task::deschedule();
-                fail!();
+                fail2!();
             }
             do m2.lock_cond |cond| {
                 c.send(()); // tell sibling go ahead
@@ -976,9 +976,9 @@ mod tests {
                         do (|| {
                             cond.wait(); // block forever
                         }).finally {
-                            error!("task unwinding and sending");
+                            error2!("task unwinding and sending");
                             c.send(());
-                            error!("task unwinding and done sending");
+                            error2!("task unwinding and done sending");
                         }
                     }
                 }
@@ -988,7 +988,7 @@ mod tests {
             }
             do m2.lock { }
             c.send(sibling_convos); // let parent wait on all children
-            fail!();
+            fail2!();
         };
         assert!(result.is_err());
         // child task must have finished by the time try returns
@@ -1028,7 +1028,7 @@ mod tests {
             let _ = p.recv();
             do m.lock_cond |cond| {
                 if !cond.signal_on(0) {
-                    fail!(); // success; punt sibling awake.
+                    fail2!(); // success; punt sibling awake.
                 }
             }
         };
@@ -1272,7 +1272,7 @@ mod tests {
 
         let result: result::Result<(),()> = do task::try || {
             do lock_rwlock_in_mode(&x2, mode1) {
-                fail!();
+                fail2!();
             }
         };
         assert!(result.is_err());
@@ -1319,7 +1319,7 @@ mod tests {
             let mut xopt = Some(xwrite);
             do y.write_downgrade |_ywrite| {
                 y.downgrade(xopt.take_unwrap());
-                error!("oops, y.downgrade(x) should have failed!");
+                error2!("oops, y.downgrade(x) should have failed!");
             }
         }
     }
diff --git a/src/libextra/term.rs b/src/libextra/term.rs
index d8eb3cfa500..c7f26507902 100644
--- a/src/libextra/term.rs
+++ b/src/libextra/term.rs
@@ -147,7 +147,7 @@ impl Terminal {
                 self.out.write(s.unwrap());
                 return true
             } else {
-                warn!("%s", s.unwrap_err());
+                warn2!("{}", s.unwrap_err());
             }
         }
         false
@@ -167,7 +167,7 @@ impl Terminal {
                 self.out.write(s.unwrap());
                 return true
             } else {
-                warn!("%s", s.unwrap_err());
+                warn2!("{}", s.unwrap_err());
             }
         }
         false
@@ -188,7 +188,7 @@ impl Terminal {
                         self.out.write(s.unwrap());
                         return true
                     } else {
-                        warn!("%s", s.unwrap_err());
+                        warn2!("{}", s.unwrap_err());
                     }
                 }
                 false
@@ -226,11 +226,11 @@ impl Terminal {
         if s.is_ok() {
             self.out.write(s.unwrap());
         } else if self.num_colors > 0 {
-            warn!("%s", s.unwrap_err());
+            warn2!("{}", s.unwrap_err());
         } else {
-            // if we support attributes but not color, it would be nice to still warn!()
+            // if we support attributes but not color, it would be nice to still warn2!()
             // but it's not worth testing all known attributes just for this.
-            debug!("%s", s.unwrap_err());
+            debug2!("{}", s.unwrap_err());
         }
     }
 
diff --git a/src/libextra/terminfo/parm.rs b/src/libextra/terminfo/parm.rs
index 8c1595e7920..81c4b35d8d0 100644
--- a/src/libextra/terminfo/parm.rs
+++ b/src/libextra/terminfo/parm.rs
@@ -278,7 +278,7 @@ pub fn expand(cap: &[u8], params: &[Param], vars: &mut Variables)
                     'e' => state = SeekIfEnd(0),
                     ';' => (),
 
-                    _ => return Err(fmt!("unrecognized format option %c", cur))
+                    _ => return Err(format!("unrecognized format option {}", cur))
                 }
             },
             PushParam => {
@@ -461,7 +461,7 @@ impl FormatOp {
             'x' => FormatHex,
             'X' => FormatHEX,
             's' => FormatString,
-            _ => fail!("bad FormatOp char")
+            _ => fail2!("bad FormatOp char")
         }
     }
     fn to_char(self) -> char {
@@ -551,7 +551,7 @@ fn format(val: Param, op: FormatOp, flags: Flags) -> Result<~[u8],~str> {
                     s
                 }
                 _ => {
-                    return Err(fmt!("non-string on stack with %%%c", op.to_char()))
+                    return Err(format!("non-string on stack with %{}", op.to_char()))
                 }
             }
         }
@@ -606,23 +606,23 @@ mod test {
         for cap in caps.iter() {
             let res = expand(cap.as_bytes(), [], vars);
             assert!(res.is_err(),
-                    "Op %s succeeded incorrectly with 0 stack entries", *cap);
+                    "Op {} succeeded incorrectly with 0 stack entries", *cap);
             let p = if *cap == "%s" || *cap == "%l" { String(~"foo") } else { Number(97) };
             let res = expand((bytes!("%p1")).to_owned() + cap.as_bytes(), [p], vars);
             assert!(res.is_ok(),
-                    "Op %s failed with 1 stack entry: %s", *cap, res.unwrap_err());
+                    "Op {} failed with 1 stack entry: {}", *cap, res.unwrap_err());
         }
         let caps = ["%+", "%-", "%*", "%/", "%m", "%&", "%|", "%A", "%O"];
         for cap in caps.iter() {
             let res = expand(cap.as_bytes(), [], vars);
             assert!(res.is_err(),
-                    "Binop %s succeeded incorrectly with 0 stack entries", *cap);
+                    "Binop {} succeeded incorrectly with 0 stack entries", *cap);
             let res = expand((bytes!("%{1}")).to_owned() + cap.as_bytes(), [], vars);
             assert!(res.is_err(),
-                    "Binop %s succeeded incorrectly with 1 stack entry", *cap);
+                    "Binop {} succeeded incorrectly with 1 stack entry", *cap);
             let res = expand((bytes!("%{1}%{2}")).to_owned() + cap.as_bytes(), [], vars);
             assert!(res.is_ok(),
-                    "Binop %s failed with 2 stack entries: %s", *cap, res.unwrap_err());
+                    "Binop {} failed with 2 stack entries: {}", *cap, res.unwrap_err());
         }
     }
 
@@ -635,15 +635,15 @@ mod test {
     fn test_comparison_ops() {
         let v = [('<', [1u8, 0u8, 0u8]), ('=', [0u8, 1u8, 0u8]), ('>', [0u8, 0u8, 1u8])];
         for &(op, bs) in v.iter() {
-            let s = fmt!("%%{1}%%{2}%%%c%%d", op);
+            let s = format!("%\\{1\\}%\\{2\\}%{}%d", op);
             let res = expand(s.as_bytes(), [], &mut Variables::new());
             assert!(res.is_ok(), res.unwrap_err());
             assert_eq!(res.unwrap(), ~['0' as u8 + bs[0]]);
-            let s = fmt!("%%{1}%%{1}%%%c%%d", op);
+            let s = format!("%\\{1\\}%\\{1\\}%{}%d", op);
             let res = expand(s.as_bytes(), [], &mut Variables::new());
             assert!(res.is_ok(), res.unwrap_err());
             assert_eq!(res.unwrap(), ~['0' as u8 + bs[1]]);
-            let s = fmt!("%%{2}%%{1}%%%c%%d", op);
+            let s = format!("%\\{2\\}%\\{1\\}%{}%d", op);
             let res = expand(s.as_bytes(), [], &mut Variables::new());
             assert!(res.is_ok(), res.unwrap_err());
             assert_eq!(res.unwrap(), ~['0' as u8 + bs[2]]);
diff --git a/src/libextra/terminfo/parser/compiled.rs b/src/libextra/terminfo/parser/compiled.rs
index 49a6210e3a9..caef3e70ce8 100644
--- a/src/libextra/terminfo/parser/compiled.rs
+++ b/src/libextra/terminfo/parser/compiled.rs
@@ -178,7 +178,8 @@ pub fn parse(file: @Reader, longnames: bool) -> Result<~TermInfo, ~str> {
     // Check magic number
     let magic = file.read_le_u16();
     if (magic != 0x011A) {
-        return Err(fmt!("invalid magic number: expected %x but found %x", 0x011A, magic as uint));
+        return Err(format!("invalid magic number: expected {:x} but found {:x}",
+                           0x011A, magic as uint));
     }
 
     let names_bytes          = file.read_le_i16() as int;
@@ -189,26 +190,26 @@ pub fn parse(file: @Reader, longnames: bool) -> Result<~TermInfo, ~str> {
 
     assert!(names_bytes          > 0);
 
-    debug!("names_bytes = %?", names_bytes);
-    debug!("bools_bytes = %?", bools_bytes);
-    debug!("numbers_count = %?", numbers_count);
-    debug!("string_offsets_count = %?", string_offsets_count);
-    debug!("string_table_bytes = %?", string_table_bytes);
+    debug2!("names_bytes = {}", names_bytes);
+    debug2!("bools_bytes = {}", bools_bytes);
+    debug2!("numbers_count = {}", numbers_count);
+    debug2!("string_offsets_count = {}", string_offsets_count);
+    debug2!("string_table_bytes = {}", string_table_bytes);
 
     if (bools_bytes as uint) > boolnames.len() {
-        error!("expected bools_bytes to be less than %? but found %?", boolnames.len(),
+        error2!("expected bools_bytes to be less than {} but found {}", boolnames.len(),
                bools_bytes);
         return Err(~"incompatible file: more booleans than expected");
     }
 
     if (numbers_count as uint) > numnames.len() {
-        error!("expected numbers_count to be less than %? but found %?", numnames.len(),
+        error2!("expected numbers_count to be less than {} but found {}", numnames.len(),
                numbers_count);
         return Err(~"incompatible file: more numbers than expected");
     }
 
     if (string_offsets_count as uint) > stringnames.len() {
-        error!("expected string_offsets_count to be less than %? but found %?", stringnames.len(),
+        error2!("expected string_offsets_count to be less than {} but found {}", stringnames.len(),
                string_offsets_count);
         return Err(~"incompatible file: more string offsets than expected");
     }
@@ -218,26 +219,26 @@ pub fn parse(file: @Reader, longnames: bool) -> Result<~TermInfo, ~str> {
 
     file.read_byte(); // consume NUL
 
-    debug!("term names: %?", term_names);
+    debug2!("term names: {:?}", term_names);
 
     let mut bools_map = HashMap::new();
     if bools_bytes != 0 {
         for i in range(0, bools_bytes) {
             let b = file.read_byte();
             if b < 0 {
-                error!("EOF reading bools after %? entries", i);
+                error2!("EOF reading bools after {} entries", i);
                 return Err(~"error: expected more bools but hit EOF");
             } else if b == 1 {
-                debug!("%s set", bnames[i]);
+                debug2!("{} set", bnames[i]);
                 bools_map.insert(bnames[i].to_owned(), true);
             }
         }
     }
 
-    debug!("bools: %?", bools_map);
+    debug2!("bools: {:?}", bools_map);
 
     if (bools_bytes + names_bytes) % 2 == 1 {
-        debug!("adjusting for padding between bools and numbers");
+        debug2!("adjusting for padding between bools and numbers");
         file.read_byte(); // compensate for padding
     }
 
@@ -246,13 +247,13 @@ pub fn parse(file: @Reader, longnames: bool) -> Result<~TermInfo, ~str> {
         for i in range(0, numbers_count) {
             let n = file.read_le_u16();
             if n != 0xFFFF {
-                debug!("%s#%?", nnames[i], n);
+                debug2!("{}\\#{}", nnames[i], n);
                 numbers_map.insert(nnames[i].to_owned(), n);
             }
         }
     }
 
-    debug!("numbers: %?", numbers_map);
+    debug2!("numbers: {:?}", numbers_map);
 
     let mut string_map = HashMap::new();
 
@@ -262,12 +263,12 @@ pub fn parse(file: @Reader, longnames: bool) -> Result<~TermInfo, ~str> {
             string_offsets.push(file.read_le_u16());
         }
 
-        debug!("offsets: %?", string_offsets);
+        debug2!("offsets: {:?}", string_offsets);
 
         let string_table = file.read_bytes(string_table_bytes as uint);
 
         if string_table.len() != string_table_bytes as uint {
-            error!("EOF reading string table after %? bytes, wanted %?", string_table.len(),
+            error2!("EOF reading string table after {} bytes, wanted {}", string_table.len(),
                    string_table_bytes);
             return Err(~"error: hit EOF before end of string table");
         }
diff --git a/src/libextra/terminfo/searcher.rs b/src/libextra/terminfo/searcher.rs
index f7999050804..5c7efdb298f 100644
--- a/src/libextra/terminfo/searcher.rs
+++ b/src/libextra/terminfo/searcher.rs
@@ -60,7 +60,7 @@ pub fn get_dbpath_for_term(term: &str) -> Option<~path> {
             return Some(newp);
         }
         // on some installations the dir is named after the hex of the char (e.g. OS X)
-        let newp = ~p.push_many(&[fmt!("%x", first_char as uint), term.to_owned()]);
+        let newp = ~p.push_many(&[format!("{:x}", first_char as uint), term.to_owned()]);
         if os::path_exists(p) && os::path_exists(newp) {
             return Some(newp);
         }
@@ -72,7 +72,7 @@ pub fn get_dbpath_for_term(term: &str) -> Option<~path> {
 pub fn open(term: &str) -> Result<@Reader, ~str> {
     match get_dbpath_for_term(term) {
         Some(x) => file_reader(x),
-        None => Err(fmt!("could not find terminfo entry for %s", term))
+        None => Err(format!("could not find terminfo entry for {}", term))
     }
 }
 
diff --git a/src/libextra/test.rs b/src/libextra/test.rs
index 4721a6b4122..1370a0690ca 100644
--- a/src/libextra/test.rs
+++ b/src/libextra/test.rs
@@ -125,10 +125,10 @@ pub fn test_main(args: &[~str], tests: ~[TestDescAndFn]) {
     let opts =
         match parse_opts(args) {
             Some(Ok(o)) => o,
-            Some(Err(msg)) => fail!(msg),
+            Some(Err(msg)) => fail2!(msg),
             None => return
         };
-    if !run_tests_console(&opts, tests) { fail!("Some tests failed"); }
+    if !run_tests_console(&opts, tests) { fail2!("Some tests failed"); }
 }
 
 // A variant optimized for invocation with a static test vector.
@@ -148,7 +148,7 @@ pub fn test_main_static(args: &[~str], tests: &[TestDescAndFn]) {
             TestDescAndFn { testfn: StaticBenchFn(f), desc: t.desc.clone() },
 
             _ => {
-                fail!("non-static tests passed to test::test_main_static");
+                fail2!("non-static tests passed to test::test_main_static");
             }
         }
     };
@@ -192,7 +192,7 @@ fn optgroups() -> ~[getopts::groups::OptGroup] {
 fn usage(binary: &str, helpstr: &str) {
     #[fixed_stack_segment]; #[inline(never)];
 
-    let message = fmt!("Usage: %s [OPTIONS] [FILTER]", binary);
+    let message = format!("Usage: {} [OPTIONS] [FILTER]", binary);
     println(groups::usage(message, optgroups()));
     println("");
     if helpstr == "help" {
@@ -210,7 +210,7 @@ Test Attributes:
     #[bench]       - Indicates a function is a benchmark to be run. This
                      function takes one argument (extra::test::BenchHarness).
     #[should_fail] - This function (also labeled with #[test]) will only pass if
-                     the code causes a failure (an assertion failure or fail!)
+                     the code causes a failure (an assertion failure or fail2!)
     #[ignore]      - When applied to a function which is already attributed as a
                      test, then the test runner will ignore these tests during
                      normal test runs. Running with --ignored will run these
@@ -327,7 +327,7 @@ impl ConsoleTestState {
                                                      io::Truncate]) {
                 result::Ok(w) => Some(w),
                 result::Err(ref s) => {
-                    fail!("can't open output file: %s", *s)
+                    fail2!("can't open output file: {}", *s)
                 }
             },
             None => None
@@ -408,11 +408,11 @@ impl ConsoleTestState {
     pub fn write_run_start(&mut self, len: uint) {
         self.total = len;
         let noun = if len != 1 { &"tests" } else { &"test" };
-        self.out.write_line(fmt!("\nrunning %u %s", len, noun));
+        self.out.write_line(format!("\nrunning {} {}", len, noun));
     }
 
     pub fn write_test_start(&self, test: &TestDesc) {
-        self.out.write_str(fmt!("test %s ... ", test.name.to_str()));
+        self.out.write_str(format!("test {} ... ", test.name.to_str()));
     }
 
     pub fn write_result(&self, result: &TestResult) {
@@ -436,7 +436,7 @@ impl ConsoleTestState {
         match self.log_out {
             None => (),
             Some(out) => {
-                out.write_line(fmt!("%s %s",
+                out.write_line(format!("{} {}",
                                     match *result {
                                         TrOk => ~"ok",
                                         TrFailed => ~"failed",
@@ -456,7 +456,7 @@ impl ConsoleTestState {
         }
         sort::tim_sort(failures);
         for name in failures.iter() {
-            self.out.write_line(fmt!("    %s", name.to_str()));
+            self.out.write_line(format!("    {}", name.to_str()));
         }
     }
 
@@ -473,31 +473,31 @@ impl ConsoleTestState {
                 MetricAdded => {
                     added += 1;
                     self.write_added();
-                    self.out.write_line(fmt!(": %s", *k));
+                    self.out.write_line(format!(": {}", *k));
                 }
                 MetricRemoved => {
                     removed += 1;
                     self.write_removed();
-                    self.out.write_line(fmt!(": %s", *k));
+                    self.out.write_line(format!(": {}", *k));
                 }
                 Improvement(pct) => {
                     improved += 1;
                     self.out.write_str(*k);
                     self.out.write_str(": ");
                     self.write_improved();
-                    self.out.write_line(fmt!(" by %.2f%%", pct as float))
+                    self.out.write_line(format!(" by {:.2f}%", pct as float))
                 }
                 Regression(pct) => {
                     regressed += 1;
                     self.out.write_str(*k);
                     self.out.write_str(": ");
                     self.write_regressed();
-                    self.out.write_line(fmt!(" by %.2f%%", pct as float))
+                    self.out.write_line(format!(" by {:.2f}%", pct as float))
                 }
             }
         }
-        self.out.write_line(fmt!("result of ratchet: %u matrics added, %u removed, \
-                                  %u improved, %u regressed, %u noise",
+        self.out.write_line(format!("result of ratchet: {} matrics added, {} removed, \
+                                  {} improved, {} regressed, {} noise",
                                  added, removed, improved, regressed, noise));
         if regressed == 0 {
             self.out.write_line("updated ratchet file")
@@ -514,11 +514,11 @@ impl ConsoleTestState {
         let ratchet_success = match *ratchet_metrics {
             None => true,
             Some(ref pth) => {
-                self.out.write_str(fmt!("\nusing metrics ratchet: %s\n", pth.to_str()));
+                self.out.write_str(format!("\nusing metrics ratchet: {}\n", pth.to_str()));
                 match ratchet_pct {
                     None => (),
                     Some(pct) =>
-                    self.out.write_str(fmt!("with noise-tolerance forced to: %f%%\n",
+                    self.out.write_str(format!("with noise-tolerance forced to: {}%%\n",
                                             pct as float))
                 }
                 let (diff, ok) = self.metrics.ratchet(pth, ratchet_pct);
@@ -541,7 +541,7 @@ impl ConsoleTestState {
         } else {
             self.write_failed();
         }
-        self.out.write_str(fmt!(". %u passed; %u failed; %u ignored; %u measured\n\n",
+        self.out.write_str(format!(". {} passed; {} failed; {} ignored; {} measured\n\n",
                                 self.passed, self.failed, self.ignored, self.measured));
         return success;
     }
@@ -549,7 +549,7 @@ impl ConsoleTestState {
 
 pub fn fmt_metrics(mm: &MetricMap) -> ~str {
     let v : ~[~str] = mm.iter()
-        .map(|(k,v)| fmt!("%s: %f (+/- %f)",
+        .map(|(k,v)| format!("{}: {} (+/- {})",
                           *k,
                           v.value as float,
                           v.noise as float))
@@ -559,12 +559,12 @@ pub fn fmt_metrics(mm: &MetricMap) -> ~str {
 
 pub fn fmt_bench_samples(bs: &BenchSamples) -> ~str {
     if bs.mb_s != 0 {
-        fmt!("%u ns/iter (+/- %u) = %u MB/s",
+        format!("{} ns/iter (+/- {}) = {} MB/s",
              bs.ns_iter_summ.median as uint,
              (bs.ns_iter_summ.max - bs.ns_iter_summ.min) as uint,
              bs.mb_s)
     } else {
-        fmt!("%u ns/iter (+/- %u)",
+        format!("{} ns/iter (+/- {})",
              bs.ns_iter_summ.median as uint,
              (bs.ns_iter_summ.max - bs.ns_iter_summ.min) as uint)
     }
@@ -574,7 +574,7 @@ pub fn fmt_bench_samples(bs: &BenchSamples) -> ~str {
 pub fn run_tests_console(opts: &TestOpts,
                          tests: ~[TestDescAndFn]) -> bool {
     fn callback(event: &TestEvent, st: &mut ConsoleTestState) {
-        debug!("callback(event=%?)", event);
+        debug2!("callback(event={:?})", event);
         match (*event).clone() {
             TeFiltered(ref filtered_tests) => st.write_run_start(filtered_tests.len()),
             TeWait(ref test) => st.write_test_start(test),
@@ -612,7 +612,7 @@ pub fn run_tests_console(opts: &TestOpts,
         None => (),
         Some(ref pth) => {
             st.metrics.save(pth);
-            st.out.write_str(fmt!("\nmetrics saved to: %s", pth.to_str()));
+            st.out.write_str(format!("\nmetrics saved to: {}", pth.to_str()));
         }
     }
     return st.write_run_finish(&opts.ratchet_metrics, opts.ratchet_noise_percent);
@@ -688,7 +688,7 @@ fn run_tests(opts: &TestOpts,
     // It's tempting to just spawn all the tests at once, but since we have
     // many tests that run in other processes we would be making a big mess.
     let concurrency = get_concurrency();
-    debug!("using %u test tasks", concurrency);
+    debug2!("using {} test tasks", concurrency);
 
     let mut remaining = filtered_tests;
     remaining.reverse();
@@ -735,7 +735,7 @@ fn get_concurrency() -> uint {
             let opt_n: Option<uint> = FromStr::from_str(s);
             match opt_n {
                 Some(n) if n > 0 => n,
-                _ => fail!("RUST_TEST_TASKS is `%s`, should be a positive integer.", s)
+                _ => fail2!("RUST_TEST_TASKS is `{}`, should be a positive integer.", s)
             }
         }
         None => {
@@ -1001,7 +1001,7 @@ impl MetricMap {
         };
 
         if ok {
-            debug!("rewriting file '%s' with updated metrics");
+            debug2!("rewriting file '{:?}' with updated metrics", p);
             self.save(p);
         }
         return (diff, ok)
@@ -1040,7 +1040,7 @@ impl BenchHarness {
 
     pub fn bench_n(&mut self, n: u64, f: &fn(&mut BenchHarness)) {
         self.iterations = n;
-        debug!("running benchmark for %u iterations",
+        debug2!("running benchmark for {} iterations",
                n as uint);
         f(self);
     }
@@ -1081,7 +1081,7 @@ impl BenchHarness {
             stats::winsorize(samples, 5.0);
             let summ5 = stats::Summary::new(samples);
 
-            debug!("%u samples, median %f, MAD=%f, MADP=%f",
+            debug2!("{} samples, median {}, MAD={}, MADP={}",
                    samples.len(),
                    summ.median as float,
                    summ.median_abs_dev as float,
@@ -1153,7 +1153,7 @@ mod tests {
 
     #[test]
     pub fn do_not_run_ignored_tests() {
-        fn f() { fail!(); }
+        fn f() { fail2!(); }
         let desc = TestDescAndFn {
             desc: TestDesc {
                 name: StaticTestName("whatever"),
@@ -1189,7 +1189,7 @@ mod tests {
 
     #[test]
     fn test_should_fail() {
-        fn f() { fail!(); }
+        fn f() { fail2!(); }
         let desc = TestDescAndFn {
             desc: TestDesc {
                 name: StaticTestName("whatever"),
@@ -1228,7 +1228,7 @@ mod tests {
         let args = ~[~"progname", ~"filter"];
         let opts = match parse_opts(args) {
             Some(Ok(o)) => o,
-            _ => fail!("Malformed arg in first_free_arg_should_be_a_filter")
+            _ => fail2!("Malformed arg in first_free_arg_should_be_a_filter")
         };
         assert!("filter" == opts.filter.clone().unwrap());
     }
@@ -1238,7 +1238,7 @@ mod tests {
         let args = ~[~"progname", ~"filter", ~"--ignored"];
         let opts = match parse_opts(args) {
             Some(Ok(o)) => o,
-            _ => fail!("Malformed arg in parse_ignored_flag")
+            _ => fail2!("Malformed arg in parse_ignored_flag")
         };
         assert!((opts.run_ignored));
     }
diff --git a/src/libextra/time.rs b/src/libextra/time.rs
index d51d1c21785..7f08fcd908a 100644
--- a/src/libextra/time.rs
+++ b/src/libextra/time.rs
@@ -259,7 +259,7 @@ impl Tm {
             let mut m = num::abs(self.tm_gmtoff) / 60_i32;
             let h = m / 60_i32;
             m -= h * 60_i32;
-            s + fmt!("%c%02d:%02d", sign, h as int, m as int)
+            s + format!("{}{:02d}:{:02d}", sign, h as int, m as int)
         }
     }
 }
@@ -364,7 +364,7 @@ fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
         if c == range.ch {
             Ok(range.next)
         } else {
-            Err(fmt!("Expected %?, found %?",
+            Err(format!("Expected {}, found {}",
                 str::from_char(c),
                 str::from_char(range.ch)))
         }
@@ -671,7 +671,7 @@ fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
           }
           '%' => parse_char(s, pos, '%'),
           ch => {
-            Err(fmt!("unknown formatting type: %?", str::from_char(ch)))
+            Err(format!("unknown formatting type: {}", str::from_char(ch)))
           }
         }
     }
@@ -736,7 +736,7 @@ fn do_strptime(s: &str, format: &str) -> Result<Tm, ~str> {
 fn do_strftime(format: &str, tm: &Tm) -> ~str {
     fn parse_type(ch: char, tm: &Tm) -> ~str {
         //FIXME (#2350): Implement missing types.
-      let die = || fmt!("strftime: can't understand this format %c ", ch);
+      let die = || format!("strftime: can't understand this format {} ", ch);
         match ch {
           'A' => match tm.tm_wday as int {
             0 => ~"Sunday",
@@ -788,9 +788,9 @@ fn do_strftime(format: &str, tm: &Tm) -> ~str {
             11 => ~"Dec",
             _  => die()
           },
-          'C' => fmt!("%02d", (tm.tm_year as int + 1900) / 100),
+          'C' => format!("{:02d}", (tm.tm_year as int + 1900) / 100),
           'c' => {
-            fmt!("%s %s %s %s %s",
+            format!("{} {} {} {} {}",
                 parse_type('a', tm),
                 parse_type('b', tm),
                 parse_type('e', tm),
@@ -798,58 +798,58 @@ fn do_strftime(format: &str, tm: &Tm) -> ~str {
                 parse_type('Y', tm))
           }
           'D' | 'x' => {
-            fmt!("%s/%s/%s",
+            format!("{}/{}/{}",
                 parse_type('m', tm),
                 parse_type('d', tm),
                 parse_type('y', tm))
           }
-          'd' => fmt!("%02d", tm.tm_mday as int),
-          'e' => fmt!("%2d", tm.tm_mday as int),
-          'f' => fmt!("%09d", tm.tm_nsec as int),
+          'd' => format!("{:02d}", tm.tm_mday),
+          'e' => format!("{:2d}", tm.tm_mday),
+          'f' => format!("{:09d}", tm.tm_nsec),
           'F' => {
-            fmt!("%s-%s-%s",
+            format!("{}-{}-{}",
                 parse_type('Y', tm),
                 parse_type('m', tm),
                 parse_type('d', tm))
           }
           //'G' {}
           //'g' {}
-          'H' => fmt!("%02d", tm.tm_hour as int),
+          'H' => format!("{:02d}", tm.tm_hour),
           'I' => {
-            let mut h = tm.tm_hour as int;
+            let mut h = tm.tm_hour;
             if h == 0 { h = 12 }
             if h > 12 { h -= 12 }
-            fmt!("%02d", h)
+            format!("{:02d}", h)
           }
-          'j' => fmt!("%03d", tm.tm_yday as int + 1),
-          'k' => fmt!("%2d", tm.tm_hour as int),
+          'j' => format!("{:03d}", tm.tm_yday + 1),
+          'k' => format!("{:2d}", tm.tm_hour),
           'l' => {
-            let mut h = tm.tm_hour as int;
+            let mut h = tm.tm_hour;
             if h == 0 { h = 12 }
             if h > 12 { h -= 12 }
-            fmt!("%2d", h)
+            format!("{:2d}", h)
           }
-          'M' => fmt!("%02d", tm.tm_min as int),
-          'm' => fmt!("%02d", tm.tm_mon as int + 1),
+          'M' => format!("{:02d}", tm.tm_min),
+          'm' => format!("{:02d}", tm.tm_mon + 1),
           'n' => ~"\n",
           'P' => if (tm.tm_hour as int) < 12 { ~"am" } else { ~"pm" },
           'p' => if (tm.tm_hour as int) < 12 { ~"AM" } else { ~"PM" },
           'R' => {
-            fmt!("%s:%s",
+            format!("{}:{}",
                 parse_type('H', tm),
                 parse_type('M', tm))
           }
           'r' => {
-            fmt!("%s:%s:%s %s",
+            format!("{}:{}:{} {}",
                 parse_type('I', tm),
                 parse_type('M', tm),
                 parse_type('S', tm),
                 parse_type('p', tm))
           }
-          'S' => fmt!("%02d", tm.tm_sec as int),
-          's' => fmt!("%d", tm.to_timespec().sec as int),
+          'S' => format!("{:02d}", tm.tm_sec),
+          's' => format!("{}", tm.to_timespec().sec),
           'T' | 'X' => {
-            fmt!("%s:%s:%s",
+            format!("{}:{}:{}",
                 parse_type('H', tm),
                 parse_type('M', tm),
                 parse_type('S', tm))
@@ -862,7 +862,7 @@ fn do_strftime(format: &str, tm: &Tm) -> ~str {
           }
           //'V' {}
           'v' => {
-            fmt!("%s-%s-%s",
+            format!("{}-{}-{}",
                 parse_type('e', tm),
                 parse_type('b', tm),
                 parse_type('Y', tm))
@@ -872,14 +872,14 @@ fn do_strftime(format: &str, tm: &Tm) -> ~str {
           //'X' {}
           //'x' {}
           'Y' => (tm.tm_year as int + 1900).to_str(),
-          'y' => fmt!("%02d", (tm.tm_year as int + 1900) % 100),
+          'y' => format!("{:02d}", (tm.tm_year as int + 1900) % 100),
           'Z' => tm.tm_zone.clone(),
           'z' => {
             let sign = if tm.tm_gmtoff > 0_i32 { '+' } else { '-' };
             let mut m = num::abs(tm.tm_gmtoff) / 60_i32;
             let h = m / 60_i32;
             m -= h * 60_i32;
-            fmt!("%c%02d%02d", sign, h as int, m as int)
+            format!("{}{:02d}{:02d}", sign, h, m)
           }
           //'+' {}
           '%' => ~"%",
@@ -914,13 +914,13 @@ mod tests {
         static SOME_FUTURE_DATE: i64 = 1577836800i64; // 2020-01-01T00:00:00Z
 
         let tv1 = get_time();
-        debug!("tv1=%? sec + %? nsec", tv1.sec as uint, tv1.nsec as uint);
+        debug2!("tv1={:?} sec + {:?} nsec", tv1.sec as uint, tv1.nsec as uint);
 
         assert!(tv1.sec > SOME_RECENT_DATE);
         assert!(tv1.nsec < 1000000000i32);
 
         let tv2 = get_time();
-        debug!("tv2=%? sec + %? nsec", tv2.sec as uint, tv2.nsec as uint);
+        debug2!("tv2={:?} sec + {:?} nsec", tv2.sec as uint, tv2.nsec as uint);
 
         assert!(tv2.sec >= tv1.sec);
         assert!(tv2.sec < SOME_FUTURE_DATE);
@@ -934,16 +934,16 @@ mod tests {
         let s0 = precise_time_s();
         let ns1 = precise_time_ns();
 
-        debug!("s0=%s sec", float::to_str_digits(s0, 9u));
+        debug2!("s0={} sec", float::to_str_digits(s0, 9u));
         assert!(s0 > 0.);
         let ns0 = (s0 * 1000000000.) as u64;
-        debug!("ns0=%? ns", ns0);
+        debug2!("ns0={:?} ns", ns0);
 
-        debug!("ns1=%? ns", ns0);
+        debug2!("ns1={:?} ns", ns0);
         assert!(ns1 >= ns0);
 
         let ns2 = precise_time_ns();
-        debug!("ns2=%? ns", ns0);
+        debug2!("ns2={:?} ns", ns0);
         assert!(ns2 >= ns1);
     }
 
@@ -975,7 +975,7 @@ mod tests {
         let time = Timespec::new(1234567890, 54321);
         let local = at(time);
 
-        error!("time_at: %?", local);
+        error2!("time_at: {:?}", local);
 
         assert!(local.tm_sec == 30_i32);
         assert!(local.tm_min == 31_i32);
@@ -1050,7 +1050,7 @@ mod tests {
             == Err(~"Invalid time"));
 
         match strptime("Fri Feb 13 15:31:30.01234 2009", format) {
-          Err(e) => fail!(e),
+          Err(e) => fail2!(e),
           Ok(ref tm) => {
             assert!(tm.tm_sec == 30_i32);
             assert!(tm.tm_min == 31_i32);
@@ -1070,7 +1070,7 @@ mod tests {
         fn test(s: &str, format: &str) -> bool {
             match strptime(s, format) {
               Ok(ref tm) => tm.strftime(format) == s.to_owned(),
-              Err(e) => fail!(e)
+              Err(e) => fail2!(e)
             }
         }
 
@@ -1196,7 +1196,7 @@ mod tests {
         let utc   = at_utc(time);
         let local = at(time);
 
-        error!("test_ctime: %? %?", utc.ctime(), local.ctime());
+        error2!("test_ctime: {:?} {:?}", utc.ctime(), local.ctime());
 
         assert_eq!(utc.ctime(), ~"Fri Feb 13 23:31:30 2009");
         assert_eq!(local.ctime(), ~"Fri Feb 13 15:31:30 2009");
diff --git a/src/libextra/treemap.rs b/src/libextra/treemap.rs
index 8ddc0413aa3..ee7ba4a888b 100644
--- a/src/libextra/treemap.rs
+++ b/src/libextra/treemap.rs
@@ -831,7 +831,7 @@ fn remove<K: TotalOrd, V>(node: &mut Option<~TreeNode<K, V>>,
       }
     }
     return match node.take() {
-        Some(~TreeNode{value, _}) => Some(value), None => fail!()
+        Some(~TreeNode{value, _}) => Some(value), None => fail2!()
     };
 }
 
@@ -900,7 +900,7 @@ mod test_treemap {
         assert!(m.insert(5, 14));
         let new = 100;
         match m.find_mut(&5) {
-          None => fail!(), Some(x) => *x = new
+          None => fail2!(), Some(x) => *x = new
         }
         assert_eq!(m.find(&5), Some(&new));
     }
diff --git a/src/libextra/url.rs b/src/libextra/url.rs
index 451b410833f..7a10c0439da 100644
--- a/src/libextra/url.rs
+++ b/src/libextra/url.rs
@@ -93,10 +93,10 @@ fn encode_inner(s: &str, full_url: bool) -> ~str {
                         out.push_char(ch);
                       }
 
-                      _ => out.push_str(fmt!("%%%X", ch as uint))
+                      _ => out.push_str(format!("%{:X}", ch as uint))
                     }
                 } else {
-                    out.push_str(fmt!("%%%X", ch as uint));
+                    out.push_str(format!("%{:X}", ch as uint));
                 }
               }
             }
@@ -192,7 +192,7 @@ fn encode_plus(s: &str) -> ~str {
                 out.push_char(ch);
               }
               ' ' => out.push_char('+'),
-              _ => out.push_str(fmt!("%%%X", ch as uint))
+              _ => out.push_str(format!("%{:X}", ch as uint))
             }
         }
 
@@ -218,7 +218,7 @@ pub fn encode_form_urlencoded(m: &HashMap<~str, ~[~str]>) -> ~str {
                 first = false;
             }
 
-            out.push_str(fmt!("%s=%s", key, encode_plus(*value)));
+            out.push_str(format!("{}={}", key, encode_plus(*value)));
         }
     }
 
@@ -324,8 +324,8 @@ fn userinfo_from_str(uinfo: &str) -> UserInfo {
 
 fn userinfo_to_str(userinfo: &UserInfo) -> ~str {
     match userinfo.pass {
-        Some(ref pass) => fmt!("%s:%s@", userinfo.user, *pass),
-        None => fmt!("%s@", userinfo.user),
+        Some(ref pass) => format!("{}:{}@", userinfo.user, *pass),
+        None => format!("{}@", userinfo.user),
     }
 }
 
@@ -345,7 +345,7 @@ pub fn query_to_str(query: &Query) -> ~str {
     for kv in query.iter() {
         match kv {
             &(ref k, ref v) => {
-                strvec.push(fmt!("%s=%s",
+                strvec.push(format!("{}={}",
                     encode_component(*k),
                     encode_component(*v))
                 );
@@ -673,21 +673,21 @@ pub fn to_str(url: &Url) -> ~str {
     let authority = if url.host.is_empty() {
         ~""
     } else {
-        fmt!("//%s%s", user, url.host)
+        format!("//{}{}", user, url.host)
     };
 
     let query = if url.query.is_empty() {
         ~""
     } else {
-        fmt!("?%s", query_to_str(&url.query))
+        format!("?{}", query_to_str(&url.query))
     };
 
     let fragment = match url.fragment {
-        Some(ref fragment) => fmt!("#%s", encode_component(*fragment)),
+        Some(ref fragment) => format!("\\#{}", encode_component(*fragment)),
         None => ~"",
     };
 
-    fmt!("%s:%s%s%s%s", url.scheme, authority, url.path, query, fragment)
+    format!("{}:{}{}{}{}", url.scheme, authority, url.path, query, fragment)
 }
 
 impl ToStr for Url {
diff --git a/src/libextra/uuid.rs b/src/libextra/uuid.rs
index 77f8edc10aa..6da97d8628a 100644
--- a/src/libextra/uuid.rs
+++ b/src/libextra/uuid.rs
@@ -129,17 +129,17 @@ impl ToStr for ParseError {
     fn to_str(&self) -> ~str {
         match *self {
             ErrorInvalidLength(found) =>
-                fmt!("Invalid length; expecting 32, 36 or 45 chars, found %u",
-                    found),
+                format!("Invalid length; expecting 32, 36 or 45 chars, found {}",
+                        found),
             ErrorInvalidCharacter(found, pos) =>
-                fmt!("Invalid character; found `%c` (0x%02x) at offset %u",
-                    found, found as uint, pos),
+                format!("Invalid character; found `{}` (0x{:02x}) at offset {}",
+                        found, found as uint, pos),
             ErrorInvalidGroups(found) =>
-                fmt!("Malformed; wrong number of groups: expected 1 or 5, found %u",
-                    found),
+                format!("Malformed; wrong number of groups: expected 1 or 5, found {}",
+                        found),
             ErrorInvalidGroupLength(group, found, expecting) =>
-                fmt!("Malformed; length of group %u was %u, expecting %u",
-                    group, found, expecting),
+                format!("Malformed; length of group {} was {}, expecting {}",
+                        group, found, expecting),
         }
     }
 }
@@ -303,7 +303,7 @@ impl Uuid {
     pub fn to_simple_str(&self) -> ~str {
         let mut s: ~[u8] = vec::from_elem(32, 0u8);
         for i in range(0u, 16u) {
-            let digit = fmt!("%02x", self.bytes[i] as uint);
+            let digit = format!("{:02x}", self.bytes[i] as uint);
             s[i*2+0] = digit[0];
             s[i*2+1] = digit[1];
         }
@@ -324,12 +324,13 @@ impl Uuid {
         uf.data1 = to_be32(uf.data1 as i32) as u32;
         uf.data2 = to_be16(uf.data2 as i16) as u16;
         uf.data3 = to_be16(uf.data3 as i16) as u16;
-        let s = fmt!("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-            uf.data1 as uint,
-            uf.data2 as uint, uf.data3 as uint,
-            uf.data4[0] as uint, uf.data4[1] as uint,
-            uf.data4[2] as uint, uf.data4[3] as uint, uf.data4[4] as uint,
-            uf.data4[5] as uint, uf.data4[6] as uint, uf.data4[7] as uint);
+        let s = format!("{:08x}-{:04x}-{:04x}-{:02x}{:02x}-\
+                         {:02x}{:02x}{:02x}{:02x}{:02x}{:02x}",
+            uf.data1,
+            uf.data2, uf.data3,
+            uf.data4[0], uf.data4[1],
+            uf.data4[2], uf.data4[3], uf.data4[4],
+            uf.data4[5], uf.data4[6], uf.data4[7]);
         s
     }
 
diff --git a/src/libextra/workcache.rs b/src/libextra/workcache.rs
index e24fe3eb8c2..32a2d83d814 100644
--- a/src/libextra/workcache.rs
+++ b/src/libextra/workcache.rs
@@ -183,11 +183,11 @@ impl Database {
         assert!(os::path_exists(&self.db_filename));
         let f = io::file_reader(&self.db_filename);
         match f {
-            Err(e) => fail!("Couldn't load workcache database %s: %s",
+            Err(e) => fail2!("Couldn't load workcache database {}: {}",
                             self.db_filename.to_str(), e.to_str()),
             Ok(r) =>
                 match json::from_reader(r) {
-                    Err(e) => fail!("Couldn't parse workcache database (from file %s): %s",
+                    Err(e) => fail2!("Couldn't parse workcache database (from file {}): {}",
                                     self.db_filename.to_str(), e.to_str()),
                     Ok(r) => {
                         let mut decoder = json::Decoder(r);
@@ -264,7 +264,7 @@ fn json_encode<T:Encodable<json::Encoder>>(t: &T) -> ~str {
 
 // FIXME(#5121)
 fn json_decode<T:Decodable<json::Decoder>>(s: &str) -> T {
-    debug!("json decoding: %s", s);
+    debug2!("json decoding: {}", s);
     do io::with_str_reader(s) |rdr| {
         let j = json::from_reader(rdr).unwrap();
         let mut decoder = json::Decoder(j);
@@ -321,7 +321,7 @@ impl Exec {
                           dependency_kind: &str,
                           dependency_name: &str,
                           dependency_val: &str) {
-        debug!("Discovering input %s %s %s", dependency_kind, dependency_name, dependency_val);
+        debug2!("Discovering input {} {} {}", dependency_kind, dependency_name, dependency_val);
         self.discovered_inputs.insert_work_key(WorkKey::new(dependency_kind, dependency_name),
                                  dependency_val.to_owned());
     }
@@ -329,7 +329,7 @@ impl Exec {
                            dependency_kind: &str,
                            dependency_name: &str,
                            dependency_val: &str) {
-        debug!("Discovering output %s %s %s", dependency_kind, dependency_name, dependency_val);
+        debug2!("Discovering output {} {} {}", dependency_kind, dependency_name, dependency_val);
         self.discovered_outputs.insert_work_key(WorkKey::new(dependency_kind, dependency_name),
                                  dependency_val.to_owned());
     }
@@ -368,7 +368,7 @@ impl<'self> Prep<'self> {
 
 impl<'self> Prep<'self> {
     pub fn declare_input(&mut self, kind: &str, name: &str, val: &str) {
-        debug!("Declaring input %s %s %s", kind, name, val);
+        debug2!("Declaring input {} {} {}", kind, name, val);
         self.declared_inputs.insert_work_key(WorkKey::new(kind, name),
                                  val.to_owned());
     }
@@ -377,17 +377,17 @@ impl<'self> Prep<'self> {
                 name: &str, val: &str) -> bool {
         let k = kind.to_owned();
         let f = self.ctxt.freshness.get().find(&k);
-        debug!("freshness for: %s/%s/%s/%s", cat, kind, name, val)
+        debug2!("freshness for: {}/{}/{}/{}", cat, kind, name, val)
         let fresh = match f {
-            None => fail!("missing freshness-function for '%s'", kind),
+            None => fail2!("missing freshness-function for '{}'", kind),
             Some(f) => (*f)(name, val)
         };
         do self.ctxt.logger.write |lg| {
             if fresh {
-                lg.info(fmt!("%s %s:%s is fresh",
+                lg.info(format!("{} {}:{} is fresh",
                              cat, kind, name));
             } else {
-                lg.info(fmt!("%s %s:%s is not fresh",
+                lg.info(format!("{} {}:{} is not fresh",
                              cat, kind, name))
             }
         };
@@ -418,7 +418,7 @@ impl<'self> Prep<'self> {
             &'self self, blk: ~fn(&mut Exec) -> T) -> Work<'self, T> {
         let mut bo = Some(blk);
 
-        debug!("exec_work: looking up %s and %?", self.fn_name,
+        debug2!("exec_work: looking up {} and {:?}", self.fn_name,
                self.declared_inputs);
         let cached = do self.ctxt.db.read |db| {
             db.prepare(self.fn_name, &self.declared_inputs)
@@ -429,14 +429,14 @@ impl<'self> Prep<'self> {
             if self.all_fresh("declared input",&self.declared_inputs) &&
                self.all_fresh("discovered input", disc_in) &&
                self.all_fresh("discovered output", disc_out) => {
-                debug!("Cache hit!");
-                debug!("Trying to decode: %? / %? / %?",
+                debug2!("Cache hit!");
+                debug2!("Trying to decode: {:?} / {:?} / {}",
                        disc_in, disc_out, *res);
                 Work::from_value(json_decode(*res))
             }
 
             _ => {
-                debug!("Cache miss!");
+                debug2!("Cache miss!");
                 let (port, chan) = oneshot();
                 let blk = bo.take_unwrap();
                 let chan = Cell::new(chan);