/todo

To get this branch, use:
bzr branch http://bzr.ed.am/todo

« back to all changes in this revision

Viewing changes to todo

  • Committer: edam
  • Date: 2011-09-30 10:20:26 UTC
  • Revision ID: edam@waxworlds.org-20110930102026-8kbh15ufm67eit0k
init

Show diffs side-by-side

added added

removed removed

Lines of Context:
11
11
# option defaults
12
12
my $todo_dir = "~/.todo";
13
13
my $display_all = 0;
14
 
my $display_section = "TODO";
 
14
my $display_section = "IMMEDIATE";
15
15
my $display_headers = 0;
16
16
my $mode_edit = 0;
17
17
my $mode_help = 0;
34
34
# help mode
35
35
if( $mode_help ) {
36
36
    print "todo - display your todo file\n\n".
37
 
    "Usage: $app_name [OPTIONS]\n\n".
38
 
    "Options:\n".
39
 
    "  -a, --all              display all sections\n".
40
 
    "  -e, --edit             edit your todo file\n".
41
 
    "  -h, --headers          show setion headers\n".
42
 
    "  -s, --section=SECTION  display this named section\n".
43
 
    "      --help     display this help and exit\n".
44
 
    "      --version  output version information and exit\n";
 
37
        "Usage: $app_name [OPTIONS]\n\n".
 
38
        "Options:\n".
 
39
        "  -a, --all              display all sections\n".
 
40
        "  -e, --edit             edit your todo file\n".
 
41
        "  -h, --headers          show setion headers\n".
 
42
        "  -s, --section=SECTION  display this named section\n".
 
43
        "      --help     display this help and exit\n".
 
44
        "      --version  output version information and exit\n";
45
45
    exit( 0 );
46
46
}
47
47
 
48
48
# version mode
49
49
if( $mode_version ) {
50
 
    print "todo 1.0\n".
51
 
        "Copyright (C) 2011 Tim Marston.\n".
52
 
        "http://ed.am/software/todo\n";
 
50
    print "todo 1.0\n" .
 
51
        "Copyright (C) 2011 Tim Marston.\n";
53
52
    exit( 0 );
54
53
}
55
54
 
69
68
if( $mode_edit )
70
69
{
71
70
    # create the todo directory, as necessary
72
 
    if( ! -d $todo_dir ) {
73
 
        mkdir $todo_dir or die "couldn't create todo directory";
74
 
        `bzr init --no-aliases -q "$todo_dir"`;
75
 
        $? == 0 or die "couldn't init bzr repo";
76
 
    }
77
 
    
78
 
    # create a default todo file, as necessary
79
 
    if( ! -f "$todo_dir/todo" ) {
80
 
        open FILE, ">$todo_dir/todo" or die "couldn't create default todo file";
81
 
        my $content = <<"EOT";
82
 
<!-- This file uses Markdown syntax. For more info about Markdown
83
 
     syntax, see http://daringfireball.net/projects/markdown/syntax.
84
 
 
85
 
     There should be a main H1 header called "TODO" for the main todo
86
 
     list section (one has been added for you below). You can also add
87
 
     as many more sections as you like for other lists. And feel free
88
 
     to delete this comment! -->
89
 
 
90
 
TODO
91
 
====
92
 
 
93
 
* make a list of things to do
94
 
 
95
 
EOT
96
 
        print FILE $content or die "couldn't write default todo file";
97
 
        close FILE;
98
 
        `bzr add --no-aliases -q "$todo_dir/todo"`;
99
 
        $? == 0 or die "couldn't add todo file to bzr repo";
100
 
    }
 
71
        if( ! -d $todo_dir ) {
 
72
                mkdir $todo_dir or die "couldn't create todo directory";
 
73
                `bzr init --no-aliases -q "$todo_dir"`;
 
74
                $? == 0 or die "couldn't init bzr repo";
 
75
                `> "$todo_dir/todo"`;
 
76
                $? == 0 or die "couldn't create initial todo file";
 
77
                `bzr add --no-aliases -q "$todo_dir/todo"`;
 
78
                $? == 0 or die "couldn't add todo file to bzr repo";
 
79
        }
101
80
 
102
81
    # determine editor from environment, default to "emacs -nw"
103
82
    my $editor = $ENV{ 'EDITOR' };
105
84
    my @exec_array = split( / +/, $editor );
106
85
    push( @exec_array, "$todo_dir/todo" );
107
86
 
108
 
    # detect emacs and try to use markdown-mode
109
 
    $exec_array[ 0 ] eq "emacs" and
110
 
        push( @exec_array, '--funcall=markdown-mode' );
 
87
        # detect emacs and try to use markdown-mode
 
88
        $exec_array[ 0 ] eq "emacs" and push( @exec_array, '--funcall=markdown-mode' );
111
89
 
112
90
    # edit todo file
113
91
    system( @exec_array );
114
 
    $? == 0 or
115
 
        die "can't start editor, check EDITOR envionment variable";
116
 
 
117
 
    # check for changes and commit it
118
 
    $output = `bzr status --no-aliases "$todo_dir/todo"`;
119
 
    $? == 0 or die "couldn't check bzr rerpo status";
120
 
    chomp $output;
121
 
    if( $output ne "" ) {
122
 
        `bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
123
 
        $? == 0 or die "couldn't commit to bzr repo";
124
 
    }
125
 
 
126
 
    # after editing, exit
127
 
    exit
 
92
        $? == 0 or die "unable to exec editor";
 
93
 
 
94
        # check for changes and commit it
 
95
        $output = `bzr status --no-aliases "$todo_dir/todo"`;
 
96
        $? == 0 or die "couldn't check bzr rerpo status";
 
97
        chomp $output;
 
98
        if( $output ne "" ) {
 
99
                `bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
 
100
                $? == 0 or die "couldn't commit to bzr repo";
 
101
        }
 
102
        
 
103
        # exit
 
104
        exit
128
105
}
129
106
 
130
107
# scan through file
137
114
 
138
115
    # detect the line after section headings, and thus sections
139
116
    if( /^[-=]{2,}/ && $next_section ne '' ) {
140
 
        $section = $next_section;
141
 
        $next_section = '';
 
117
                $section = $next_section;
 
118
                $next_section = '';
142
119
    }
143
120
    # detect section headings
144
 
    elsif( /^[-_\.A-Za-z0-9 ]+$/ ) {
145
 
        $next_section = $_;
146
 
        chomp( $next_section );
 
121
    elsif( /^[A-Z]+$/ ) {
 
122
                $next_section = $_;
 
123
                chomp( $next_section );
147
124
    }
148
125
    # we have neither a section heading nor the line after
149
126
    else {
150
 
        $next_section = '';
151
 
 
152
 
        # display line
153
 
        if( ( $section eq $display_section ) ||
154
 
            ( $section && $display_all ) )
155
 
        {
156
 
            # detect section change
157
 
            if( $section ne $old_section ) {
158
 
                $old_section = $section;
159
 
                
160
 
                # display section heading
161
 
                if( $display_headers ||
162
 
                    $display_all )
163
 
                {
164
 
                    print "$section\n".
165
 
                        ( "=" x length( $section ) )."\n";
166
 
                }
167
 
            }
168
 
 
169
 
            # replace tabs with 4 spaces
170
 
            s/\t/    /g;
171
 
 
172
 
            # display the line
173
 
            print;
174
 
        }
 
127
                $next_section = '';
 
128
 
 
129
                # display line
 
130
                if( $section eq $display_section ||
 
131
                        $display_all )
 
132
                {
 
133
                        # detect section change
 
134
                        if( $section ne $old_section ) {
 
135
                                $old_section = $section;
 
136
                                
 
137
                                # display section heading
 
138
                                if( $display_headers ||
 
139
                                        $display_all )
 
140
                                {
 
141
                                        my $heading = 'TODO';
 
142
                                        $heading .= ' ('.lc( $section ).')' if $section ne "IMMEDIATE";
 
143
                                        print "$heading\n".
 
144
                                                ( "=" x length( $heading ) )."\n";
 
145
                                }
 
146
                        }
 
147
 
 
148
                        # replace tabs with 4 spaces
 
149
                        s/\t/    /g;
 
150
 
 
151
                        # display the line
 
152
                        print;
 
153
                }
175
154
    }
176
155
}