Next: , Previous: Network Service, Up: Tutorial



2.9 Making Changes

Abe decides to do some work on his part of the code. He has a copy of Jim's database contents, but cannot edit any of that data yet. He begins his editing by checking out the head of the jp.co.juicebot.jb7 branch into a working copy, so he can edit it:

     $ monotone --db=abe.db --branch=jp.co.juicebot.jb7 checkout .

Monotone unpacks the set of files in the head revision's manifest directly into Abe's current directory. (If he had specified something other than . at the end, monotone would have created that directory and unpacked the files into it.) Abe then opens up one of the files, src/apple.c, and edits it:

     $ vi src/apple.c
     <Abe writes some apple-juice dispensing code>

The file src/apple.c has now been changed. Abe gets up to answer a phone call, and when he returns to his work he has forgotten what he changed. He can ask monotone for details:

     $ monotone diff
     #
     # patch "src/apple.c"
     #  from [2650ffc660dd00a08b659b883b65a060cac7e560]
     #    to [e2c418703c863eabe70f9bde988765406f885fd0]
     #
     --- src/apple.c
     +++ src/apple.c
     @ -1,7 +1,10 @
      #include "jb.h"
     
      void
      dispense_apple_juice()
      {
     -  /* Fill this in please, Abe. */
     +  spoutctl(APPLE_SPOUT, FLOW_JUICE, 1);
     +  while (spoutctl(APPLE_SPOUT, POLL_JUICE, 1) == 0)
     +    usleep (1000);
     +  spoutctl(APPLE_SPOUT, FLOW_JUICE, 0);
      }

Satisfied with his day's work, Abe decides to commit.

     $ monotone commit
     monotone: beginning commit
     monotone: manifest b33cb337dccf21d6673f462d677a6010b60699d1
     monotone: revision 70decb4b31a8227a629c0e364495286c5c75f979
     monotone: branch jp.co.juicebot.jb7

Abe neglected to provide a --message option specifying the change log on the command line and the file MT/log is empty because he did not document his changes there. Monotone therefore invokes an external “log message editor” — typically an editor like vi — with an explanation of the changes being committed and the opportunity to enter a log message.

     polling implementation of src/apple.c
     MT:
     MT: ----------------------------------------------------------------------
     MT: Enter Log.  Lines beginning with `MT:' are removed automatically
     MT:
     MT: new_manifest [b33cb337dccf21d6673f462d677a6010b60699d1]
     MT:
     MT: old_revision [2e24d49a48adf9acf3a1b6391a080008cbef9c21]
     MT: old_manifest [2098eddbe833046174de28172a813150a6cbda7b]
     MT:
     MT: patch "src/apple.c"
     MT: from [2650ffc660dd00a08b659b883b65a060cac7e560]
     MT:   to [e2c418703c863eabe70f9bde988765406f885fd0]
     MT:
     MT: ----------------------------------------------------------------------
     MT:

Abe enters a single line above the explanatory message, saying “polling implementation of src/apple.c”. He then saves the file and quits the editor. Monotone deletes all the lines beginning with “MT:” and leaves only Abe's short message. Returning to the shell, Abe's commit completes:

     monotone: committed revision 70decb4b31a8227a629c0e364495286c5c75f979

Abe then sends his new revision back to Jim:

     $ monotone sync jim-laptop.juicebot.co.jp jp.co.juicebot.jb7
     monotone: rebuilding merkle trees for collection jp.co.juicebot.jb7
     monotone: including branch jp.co.juicebot.jb7
     monotone: [keys: 2] [rcerts: 8]
     monotone: connecting to jim-laptop.juicebot.co.jp
     monotone: [bytes in: 630] [bytes out: 2844]
     monotone: successful exchange with jim-laptop.juicebot.co.jp

Beth does a similar sequence. First she syncs her database with Jim's:

     monotone --db=beth.db sync jim-laptop.juicebot.co.jp jp.co.juicebot.jb7
     monotone: rebuilding merkle trees for collection jp.co.juicebot.jb7
     monotone: connecting to jim-laptop.juicebot.co.jp
     monotone: [bytes in: 3200] [bytes out: 673]
     monotone: successful exchange with jim-laptop.juicebot.co.jp

She checks out a copy of the tree from her database:

     $ monotone --db=beth.db --branch=jp.co.juicebot.jb7 checkout .

She edits the file src/banana.c:

     $ vi src/banana.c
     <Beth writes some banana-juice dispensing code>

and logs her changes in MT/log right away so she does not forget what she has done like Abe.

     $ vi MT/log
     * src/banana.c: Added polling implementation

and logs her changes in MT/log right away so she does not forget what she has done:

     $ vi MT/log
     * src/banana.c: Added polling implementation

Later, she commits her work. Monotone again invokes an external editor for her to edit her log message, but this time it fills in the messages she's written so far, and she simply checks them over one last time before finishing her commit:

     $ monotone commit
     monotone: beginning commit
     monotone: manifest eaebc3c558d9e30db6616ef543595a5a64cc6d5f
     monotone: revision 80ef9c9d251d39074d37e72abf4897e0bbae1cfb
     monotone: branch jp.co.juicebot.jb7
     monotone: committed revision 80ef9c9d251d39074d37e72abf4897e0bbae1cfb

And she syncs with Jim again:

     $ monotone sync jim-laptop.juicebot.co.jp jp.co.juicebot.jb7
     monotone: rebuilding merkle trees for collection jp.co.juicebot.jb7
     monotone: including branch jp.co.juicebot.jb7
     monotone: [keys: 3] [rcerts: 12]
     monotone: connecting to jim-laptop.juicebot.co.jp
     monotone: [bytes in: 630] [bytes out: 2844]
     monotone: successful exchange with jim-laptop.juicebot.co.jp